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

 手机用户2502869145_913 发布于 2022-10-27 20:39

如图,做了一个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)
    }
6 个回答
  • 比较好的处理方法应该是把头像封装成一个单独的控件,然后初始化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的方法就不能用了。换句话说,这个控件实际上是可以在任意地方被直接使用的。

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

    2022-10-29 03:22 回答
  • 其实可不可以这样子想呢,一行有两个分区,cell的模板可以为多个~如果奇数就重用第一个,偶数重用第二个之类的~

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

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

    2022-10-29 03:31 回答
  • 1个方法是用super view,更好的办法这个方法写在cell内,用block回调

    2022-10-29 03:36 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有