如何从UItableviewcell中呈现一个视图控制器

3
我正在开发iOS应用程序时尝试遵循MVC模型,但遇到了一个问题:如何从tableviewcell中触发一个视图控制器,而不是它的父tableviewcontroller。presentViewController只能从视图控制器中调用。
以下是情况:
- 我在后端有一个数据对象myDataObject; - 我也有一个表格视图,在其中使用MyDataObject的实例填充一种表格视图单元格myDataCell; - 现在,我想通过我的DataCell中的UIButton click事件(而不是segue)以编程方式触发另一个ViewController。
我的目标是尽可能地解耦MVC,通过尝试避免每个对象保持指向其他两个相关对象的指针来实现,例如,我不希望cell保持对myDataObject的引用,也不希望它保持对其tableviewcontroller的引用。
以下是如何处理此情况的几种方案以及挑战:
1.声明myDataCellDelegate和myDataObjectDelegate,实现tableviewcontroller中来自两个代理声明的方法,并在委托中设置tableviewcontroller和myDataCell的引用。这样,myDataObject就具有对tableviewcontroller和myDataCell的引用。
问题在于如何从myDataCell中调用handleButtonTouched事件,并且仍然能够呈现下一个视图控制器,而不需要从myDataCell访问myDataObject?我已经从上面的委托方法中拥有了myDataCell对myDataObject的引用。
2.仅声明myDataObjectDelegate,并在tableviewcontroller中实现委托方法。我可以在委托中设置tableviewcontroller和myDataCell的引用。这样,myDataCell不必引用其父视图控制器,只有myDataObject具有对两者的引用。
使用此方法,我可以执行myDataObject->tableviewcontroller->presentviewcontroller。但是我如何使myDataCell->buttonclick事件成为触发器?我仍然需要将信息从myDataObject传递到myDataCell。
谢谢你们。
5个回答

1
为什么你反对使用普通的UITableViewDelegateUITableViewDataSource方法?它们非常好地遵循了MVC。
我总是有一个视图控制器作为表视图的代理和数据源。在视图控制器中,我向数据管理器发出请求(本质上是处理与模型层交互的控制器),该管理器将返回一些数据集合。我将那些数据(通常是一个NSArray)保留为视图控制器的属性,并重新加载表视图。
然后我实现-tableView:didSelectRowAtIndexPath:。在那里,我可以看到选择了哪个单元格,哪个数据对象与该单元格相关联(而不必让单元格本身保留对数据的引用),并在那一点上处理任何转换。这符合MVC的原则,因为视图不知道任何关于数据的信息。

谢谢 - 同意。看起来他们只允许我接受一个答案。我写下这个评论来确认您的贡献。 - NSCoder

0

我认为你有点过度分析了。请查看这个苹果文档,它解释了MVC设计模式。关键是视图不应引用模型,反之亦然。控制器充当中间人。


0

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

如果我有像上面那样的场景,我将解释我的MVC方法。

方法:

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

  1. 在哪里定义buttonTapped事件

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

如果我误导或漏掉了什么,请纠正我。

第一件事 - handleButtonTouched:

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

第二件事 - 如何从单元格触发presentViewController事件

cellForRowAtIndexPath方法中创建一个UIViewController的变量并将其分配。现在,您可以使用此对象从单元格呈现您的视图控制器。

如果不清楚,请留言。


是的,在一般情况下是这样的。但在我的场景中,我已经知道了indexpath,并且需要将table view controller与cellview解耦,因此我为cellview设置了一个代理。 - NSCoder

0

更新:

  • 实现了一个管理器来链接视图控制器和我的数据对象;

  • 在我的单元格上添加了手势识别器。


0

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


是的,这正是发生的事情,以呈现下一个视图。 - NSCoder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接