【问题标题】:How to Present a viewcontroller from a UItableviewcell如何从 UItableviewcell 呈现视图控制器
【发布时间】:2015-02-19 17:43:25
【问题描述】:

我在开发我的 iOS 应用程序时尝试遵循 MVC 模型,但这里有一个问题:如何从 tableviewcell 而不是其父 tableviewcontroller 触发 viewcontroller。 PresentViewController 只能从视图控制器调用。

情况如下:

  • 我在后端有一个数据对象 myDataObject;

  • 我还有一个表格视图,其中我使用 MyDataObject 的实例填充了一种表格视图单元格 myDataCell;

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

我的目标是尽可能地解耦 MVC,尽量避免让每个对象都保持指向其他两个所涉及的对象,例如,我不希望单元格保持对 MyDataObject 的引用,我也不希望它保持对其 tableviewcontroller 的引用。

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

  1. 声明myDataCellDelegate 和myDataObjectDelegate,在tableviewcontroller 中实现两个delegate 声明的方法,并在delegate 中设置tableviewcontroller 和myDataCell 的引用。这样 myDataObject 就有了对 tableviewcontroller 和 myDataCell 的引用。

这里的问题是如何从 myDataCell 调用 handleButtonTouched 事件,并且仍然能够呈现下一个视图控制器,而无需从 myDataCell 访问 myDataObject?还是我必须在 myDataCell 中保留对 myDataObject 的引用?我已经通过上面的委托方法在 myDataObject 中引用了 myDataCell。

  1. 只声明myDataObjectDelegate,并在tableviewcontroller中实现委托方法。我可以在委托中设置 tableviewcontroller 和 myDataCell 的引用。这样,myDataCell 不必引用其父视图控制器,只有 myDataObject 引用两者。

通过这种方法,我可以做 myDataObject->tableviewcontroller->presentviewcontroller。但是如何将 myDataCell->buttonclick 事件作为触发器呢?我仍然需要将信息从 myDataObject 传递给 myDataCell。

谢谢各位。

编辑:

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

【问题讨论】:

    标签: ios objective-c iphone uitableview


    【解决方案1】:

    您为什么反对使用普通的UITableViewDelegateUITableViewDataSource 方法?他们在遵守 MVC 方面做得非常出色。

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

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

    【讨论】:

    • 谢谢---同意。看起来他们只允许我接受一个答案。我写下此评论以确认您的意见。
    【解决方案2】:

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

    【讨论】:

    • 是的,这正是呈现下一个视图所发生的事情。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      更新:

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

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

      【讨论】:

        【解决方案5】:

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

        如果我遇到上述情况,我将解释我遵循 MVC 的方法。

        方法:

        我从上面的解释中发现了两个问题-

        1. 在哪里定义buttonTapped事件

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

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

        第一件事 - handleButtonTouched:

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

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

        cellForRowAtIndexPath方法中再创建一个UIViewController变量赋值。现在,您可以从单元格中使用此对象展示您的 viewController。

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

        【讨论】:

        • 是的,这在一般情况下是正确的。在我的场景中,我已经知道 indexpath,我需要将 table view controller 与 cellview 解耦,所以我为 cellview 设置了一个委托。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-03-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多