首页 > tableview cell 中点击某一部分 打开新的view传值问题

tableview cell 中点击某一部分 打开新的view传值问题

如图,做了一个tableview,每个cell都能拿到数据并且显示ok,每个cell的最左边是一张头像,现在在头像的UIImageView上添加了userAction,tap后会打开新的view,在新的view里面需要用到原来这个cell的user数据,现在问题就是,我不知道该怎么去把这个user传递到新的view里面去,因为在这个tableview页面中,点击某一个cell的头像的时候,不知道点击的是哪一个,不知道该传哪个user数据过去,

如果是点击整个cell,是可以通过func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)方法来处理的,但是这种我就不知道怎么处理了。。。

部分代码:

添加tapguesture的:

cell.userImage.userInteractionEnabled = true
let userDetailInfoSelector: Selector = #selector(EventViewController.openUserInfoPage)

let userDetailInfoGustue = UITapGestureRecognizer(target: self, action: userDetailInfoSelector)
userDetailInfoGustue.numberOfTapsRequired = 1
cell.userImage.addGestureRecognizer(userDetailInfoGustue)

TapGesture的action,

func openUserInfoPage() {
        let userDetailViewController = self.storyboard?.instantiateViewControllerWithIdentifier("UserDetailViewController") as! UserDetailViewController
        userDetailViewController.user = ?????//如何传递?

        print("in event view controller: \(self.bookOwner?.username)")

        let backItem = UIBarButtonItem(title: "<", style: .Plain, target: self, action: #selector(EventViewController.goBack))
        userDetailViewController.navigationItem.leftBarButtonItem = backItem

        userDetailViewController.navigationItem.title = "\(userDetailViewController.user?.username) 的书架"

        let followButton = UIBarButtonItem(title: "关注", style: .Plain, target: self, action: #selector(EventViewController.follow))
        userDetailViewController.navigationItem.rightBarButtonItem = followButton

        self.navigationController?.pushViewController(userDetailViewController, animated: true)
    }

1.如果你的手势添加是写在cellforrow里面,也就是跟tableview在一层,这样的话可以通过superview来找到点击的图片所在的cell
2.如果cell是自定义的,手势在cell的内部,我的思路一般是这样的,自定义的cell一般都是通过model来赋值,可以给midel多加一个字段来表示这个cell的位置信息,然后内部点击了图片后,用block把这个位置信息传出来就OK了


比较好的处理方法应该是把头像封装成一个单独的控件,然后初始化Cell时把user数据保留进去,并添加相应action。

//.h
@interface UserImageView : UIImageView
@property (nonatomic, strong) (id)user;
- (instancetype)initWithUser:(id)user;
@end

//.m
@implementation UserImageView
- (instancetype)initWithUser:(id)user {
    self = [super init];
    if (self) {
        _user = user;
        //...
        //手势设置
        //...
        [self addGestureRecognizer:userDetailInfoGustue];
    }
return self;
}

- (void)userDetailInfoSelector
{
    id userDetailViewController = [UserDetailViewController new];
    userDetailViewController.user = self.user;
    
    UITabBarController *tabBarControler = (UITabBarController *)UIApplication.sharedApplication.delegate.window.rootViewController;
    UINavigationController *navigationController = (UINavigationController *)tabBarControler.selectedViewController;
    [navigationController pushViewController:userDetailViewController];
}

关键点就是取得所在的UINavigationController,可按实际情况相应做修改。
处理后的控件耦合度会相当小,好处有2个:

  1. 不用每次都去处理麻烦的callback;

  2. 可以无视视图层次复杂度。比如说如果这里头像不是直接位于Cell中,而是一个更复杂的视图层次,楼上superview的方法就不能用了。换句话说,这个控件实际上是可以在任意地方被直接使用的。


有方法可以获取当前点击的图片或者按钮是在哪个分区哪一行的,大概(yourcell *)btn.superview这个样子,能取到相应的Cell,数据传递就不是问题了吧


1个方法是用super view,更好的办法这个方法写在cell内,用block回调


cell里面监听手势点击,然后回调(block,代理都行),将对应cell的model当参数传递即可


其实可不可以这样子想呢,一行有两个分区,cell的模板可以为多个~如果奇数就重用第一个,偶数重用第二个之类的~

【热门文章】
【热门文章】