如何从UItableviewcell呈现viewcontroller

时间:2014-10-09 21:27:12

标签: ios objective-c iphone uitableview

我正在尝试在开发我的iOS应用程序时遵循MVC模型并在此处遇到问题:如何从tableviewcell而不是其父tableviewcontroller触发viewcontroller。只能从viewcontroller调用PresentViewController。

情况如下:

  • 我在后端myDataObject;

  • 有一个数据对象
  • 我还有一个tableview,我用一个MyDataObject实例填充了一种表格视图单元myDataCell;

  • 现在,我想以编程方式(而不是segue)从myDataCell中的UIButton点击事件触发另一个ViewController。

我的目标是尽可能地解耦MVC,试图避免让每个对象保持指向其他两个参与的指针,例如,我不希望单元格保留MyDataObject的引用,也不想要它保持其tableviewcontroller的引用。

以下是如何处理这种情况以及挑战的几种情况:

  1. 声明myDataCellDelegate和myDataObjectDelegate,从tableviewcontroller中的两个委托声明实现方法,并在委托中设置tableviewcontroller和myDataCell的引用。这样myDataObject就引用了tableviewcontroller和myDataCell。
  2. 这里的问题是如何从myDataCell调用handleButtonTouched事件,并且仍然能够呈现下一个viewcontroller,而无需从myDataCell访问myDataObject?或者我是否必须在myDataCell中保留myDataObject的引用?我已经从上面的委托方法在myDataObject中引用了myDataCell。

    1. 仅声明myDataObjectDelegate,并在tableviewcontroller中实现委托方法。我可以在委托中设置tableviewcontroller和myDataCell的引用。这样myDataCell就不必引用它的父视图控制器,只有myDataObject引用它们。
    2. 通过这种方法,我可以做myDataObject-> tableviewcontroller-> presentviewcontroller。但是如何将myDataCell-> buttonclick事件作为触发器?我仍然需要将信息从myDataObject传递给myDataCell。

      谢谢你们。

      编辑:

      我忘了提到我遇到这样麻烦的目的是我打算将myDataCell和myDataObject保留在一个框架中。

5 个答案:

答案 0 :(得分:1)

您为什么反对使用普通UITableViewDelegate& UITableViewDataSource方法?他们在坚持MVC方面表现出色。

我总是有一个视图控制器,它充当表视图的委托和数据源。在视图控制器中,我向数据管理器(本质上是处理与模型层的交互的控制器)发出请求,该请求将返回一些数据集合。我将该数据(通常为NSArray)保留为视图控制器中的属性,然后重新加载表视图。

然后我实施-tableView:didSelectRowAtIndexPath:。在那里,我可以看到选择了哪个单元格,哪个数据对象与该单元格相关联(没有单元格本身保留对数据的引用),并处理此时需要的任何转换。这遵循MVC,因为视图对数据一无所知。

答案 1 :(得分:0)

我认为你过分分析了一下。看看这个解释MVC设计模式的Apple document。关键是视图不应该引用模型,反之亦然。控制器充当中间人。

答案 2 :(得分:0)

子类化UITableViewCell是一种遵循MVC的方法。

如果我有一个类似上面的场景,我将解释我跟随MVC的方法。

<强>方法

我从上面的解释中找出了两个问题 -

  1. 在何处定义buttonTapped个事件

  2. 在单元格中维护TableViewController对象

  3. 如果我误导或遗漏某些内容,请纠正我。

    第一件事 - handleButtonTouched:

    在自定义单元格的.h文件中创建按钮对象,并在cellForRowAtIndexPath的{​​{1}}中添加目标方法,以便从TableViewController获取选择器本身。

    第二件事 - 如何从单元格

    触发TableViewController事件

    再创建一个presentViewController变量,在UIViewController方法中分配它。现在,从单元格中,您可以使用此对象呈现viewController。

    如果不清楚,请发表评论。

答案 3 :(得分:0)

更新

  • 实现了一个管理器来链接视图控制器和myDataObject;

  • 在myCell上添加了手势识别器

答案 4 :(得分:0)

单元格是MVC中的视图。控制器必须做逻辑,它是中间件。 在这种情况下,我总是创建一个自定义委托,类似于UItableviewcellDelegate,类似于showThisVC:(UITableViewCell)单元格,您可以轻松获取行号,因为您知道控制器中的单元格。