我正在尝试在开发我的iOS应用程序时遵循MVC模型并在此处遇到问题:如何从tableviewcell而不是其父tableviewcontroller触发viewcontroller。只能从viewcontroller调用PresentViewController。
情况如下:
我在后端myDataObject;
我还有一个tableview,我用一个MyDataObject实例填充了一种表格视图单元myDataCell;
现在,我想以编程方式(而不是segue)从myDataCell中的UIButton点击事件触发另一个ViewController。
我的目标是尽可能地解耦MVC,试图避免让每个对象保持指向其他两个参与的指针,例如,我不希望单元格保留MyDataObject的引用,也不想要它保持其tableviewcontroller的引用。
以下是如何处理这种情况以及挑战的几种情况:
这里的问题是如何从myDataCell调用handleButtonTouched事件,并且仍然能够呈现下一个viewcontroller,而无需从myDataCell访问myDataObject?或者我是否必须在myDataCell中保留myDataObject的引用?我已经从上面的委托方法在myDataObject中引用了myDataCell。
通过这种方法,我可以做myDataObject-> tableviewcontroller-> presentviewcontroller。但是如何将myDataCell-> buttonclick事件作为触发器?我仍然需要将信息从myDataObject传递给myDataCell。
谢谢你们。
编辑:
我忘了提到我遇到这样麻烦的目的是我打算将myDataCell和myDataObject保留在一个框架中。
答案 0 :(得分:1)
您为什么反对使用普通UITableViewDelegate
& UITableViewDataSource
方法?他们在坚持MVC方面表现出色。
我总是有一个视图控制器,它充当表视图的委托和数据源。在视图控制器中,我向数据管理器(本质上是处理与模型层的交互的控制器)发出请求,该请求将返回一些数据集合。我将该数据(通常为NSArray
)保留为视图控制器中的属性,然后重新加载表视图。
然后我实施-tableView:didSelectRowAtIndexPath:
。在那里,我可以看到选择了哪个单元格,哪个数据对象与该单元格相关联(没有单元格本身保留对数据的引用),并处理此时需要的任何转换。这遵循MVC,因为视图对数据一无所知。
答案 1 :(得分:0)
我认为你过分分析了一下。看看这个解释MVC设计模式的Apple document。关键是视图不应该引用模型,反之亦然。控制器充当中间人。
答案 2 :(得分:0)
子类化UITableViewCell
是一种遵循MVC的方法。
如果我有一个类似上面的场景,我将解释我跟随MVC的方法。
<强>方法强>
我从上面的解释中找出了两个问题 -
在何处定义buttonTapped
个事件
在单元格中维护TableViewController对象
如果我误导或遗漏某些内容,请纠正我。
第一件事 -
handleButtonTouched:
在自定义单元格的.h
文件中创建按钮对象,并在cellForRowAtIndexPath
的{{1}}中添加目标方法,以便从TableViewController
获取选择器本身。
第二件事 - 如何从单元格
触发TableViewController
事件
再创建一个presentViewController
变量,在UIViewController
方法中分配它。现在,从单元格中,您可以使用此对象呈现viewController。
如果不清楚,请发表评论。
答案 3 :(得分:0)
更新
实现了一个管理器来链接视图控制器和myDataObject;
在myCell上添加了手势识别器
答案 4 :(得分:0)
单元格是MVC中的视图。控制器必须做逻辑,它是中间件。 在这种情况下,我总是创建一个自定义委托,类似于UItableviewcellDelegate,类似于showThisVC:(UITableViewCell)单元格,您可以轻松获取行号,因为您知道控制器中的单元格。