【问题标题】:What is a proper way for handling actions (events) of the UITableView cell subviews?处理 UITableViewcell 子视图的操作(事件)的正确方法是什么?
【发布时间】:2015-08-07 07:22:39
【问题描述】:

我有一个带有自定义单元格的UITableView。每个单元格都有一个相当复杂的布局和许多子视图,所有这些子视图都有事件操作:UIImageView 带有手势识别器,几个 UIButtons 带有一些动作,两个 UILabels 带有手势识别器。 所以我很感兴趣是否有一些优雅的方式来为他们处理目标动作? 现在我看到了三种方式:

  1. cellForRowAtIndexPath: 中处理带有块的操作(BlocksKit 进行救援)
  2. 创建自定义类CellEventHandler,将所有需要的依赖项(控制器的navigation controller、数据数组等)传递给它,并将所有单元格的视图操作选择器放在那里。
  3. 将所有选择器写入TableViewController(默认方式)

但我对所有这些方式并不满意。有人可以描述一些优雅的方式,这将有助于使控制器变薄,并且易于维护。我确信这个工作流程应该存在一些模式。

【问题讨论】:

  • 抱歉删除了您的 p.s.你的问题似乎是合法的,因为目前只有一票可以结束它,所以不需要“态度”。

标签: ios objective-c uitableview swift model-view-controller


【解决方案1】:

视图和操作应该在 MVC 模式的视图中,在您的情况下是自定义单元格。您应该在自定义单元格类中为gestureRecognizer(tapGestureRecognizer added on your cell)编写一种方法。方法将通过自省识别调用它的对象的类型,即 isKindOfClass UIButton/Label/ImageView。每个对象将进一步识别其标签,例如,如果gestureRecognizer 说它是调用此方法的标签,但现在您可以比较它的标签来检测它是哪个标签 label1 或 label2。

【讨论】:

    【解决方案2】:

    使用委托。构建单元格时,将其委托属性设置为符合您的委托协议的某个实例。当动作被触发时,只需将行为委托给代理即可。

    这样,您最终会得到封装在该类中的定义良好的委托协议和功能。代表是否将由您决定,例如TableViewController 或自定义类。

    【讨论】:

    • 赞成优雅的解决方案,但我认为在大多数情况下,它最终会使 UITableViewController 确认比它已经做的更多的协议,从而使它们变得更长。
    • 您不必使用 UITableViewController,只需在其中初始化您的委托并将其传递给表格单元格。
    • 如果我理解正确的话,我应该在委托自定义类中拥有所有的动作处理程序,比如didUserImageClick: 等等。当我设置单元格时,我必须初始化它的委托,然后写:[userImage addTarget:delegate action:@selector( didUserImageClick:)]。我没听错吗?
    • 如果你这样做了,委托就不是真正的“委托”,而是一个方法容器。我要做的是定义一个非常简单的占位符方法并在你的 UITableViewCell 中保留对委托的引用。您不会在单元格本身中初始化委托,而是在 UITableView 类中初始化委托,并且只将引用传递给它。然后,占位符(如果你使用这些,我假设 IBActions,否则选择器)只需要调用类似(在 Swift 中)self.delegate.didUserImageClick(...)。
    • 这个委托方法可以打包成类别:防止文件过度增长。
    【解决方案3】:

    我认为处理复杂单元格的最有效方法是继承 UITableViewCell 并在子类中直接处理所有事件。您可以直接在其中创建 IBOutlets 和不作为。

    viewForRowAtIndexPath 中,您可以简单地调用自定义函数initWithObject,您可以在类的标题中声明它,因此即使单元格的初始设置不在viewController 之外,大大简化了设置。

    【讨论】:

    • 感谢您的快速回复。这种做法会不会违反MVC的设计原则? (我们在视图类中有事件处理)
    • 也许如果你非常严格地定义它,但坦率地说,它比必须弄清楚是哪个单元触发了偶数要优雅得多。您会看到很多带有标签的代码,我认为这些代码比在单元格中整齐排列事件要草率得多。
    猜你喜欢
    • 2014-02-25
    • 2021-09-12
    • 1970-01-01
    • 1970-01-01
    • 2012-03-31
    • 1970-01-01
    • 2013-07-24
    • 1970-01-01
    • 2012-07-22
    相关资源
    最近更新 更多