如图,做了一个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个:
不用每次都去处理麻烦的callback;
可以无视视图层次复杂度。比如说如果这里头像不是直接位于Cell中,而是一个更复杂的视图层次,楼上superview的方法就不能用了。换句话说,这个控件实际上是可以在任意地方被直接使用的。
有方法可以获取当前点击的图片或者按钮是在哪个分区哪一行的,大概(yourcell *)btn.superview这个样子,能取到相应的Cell,数据传递就不是问题了吧
1个方法是用super view,更好的办法这个方法写在cell内,用block回调
cell里面监听手势点击,然后回调(block,代理都行),将对应cell的model当参数传递即可
其实可不可以这样子想呢,一行有两个分区,cell的模板可以为多个~如果奇数就重用第一个,偶数重用第二个之类的~