【问题标题】:Is writing controller code in a view class not very MVC?在视图类中编写控制器代码不是非常 MVC 吗?
【发布时间】:2015-12-21 13:14:53
【问题描述】:

我有一个UITableViewController 和自定义UITableViewCell,当我点击单元格上的某个按钮时,控制器应该推送到另一个控制器并呈现另一个视图。

我可以为代码架构师想出两种解决方案。

  1. 第一个是我创建了一个协议方法来响应单元格中的点击事件并将控制器设置为委托,因此一旦点击我的单元格,控制器就会做出反应以推送到另一个视图。

  2. 但是我也可以在我的单元类中做一些这样的事情,而不是创建委托,我不断询问 nextResponder 它是否是带有for 循环的正确控制器,一旦我得到它,我就用它来推送到下一个:

    @implementation MyCustomTableViewCell
    //...
    //...
    //...
    -(void)tappedOnSomeView
    {
        id obj = nil;
        for (obj = self; obj; obj = [obj nextResponder]) {
        if ([obj isKindOfClass:[MyTableViewController class]])
        {
            UIViewController *uiVC = (UIViewController *)obj;
            MyNextViewController *nextVC = [[MyNextViewController alloc] init];
            [uiVC.navigationController pushViewController:nextVC animated:YES];
                 return;
            }
        }
    }
    //...
    //...
    //...
    @end
    

所以这不是非常 MVC 吗?或者它是丑陋的代码?我应该只创建委托来处理其 tableview 控制器中我的单元格上的所有手势事件吗?或者还有其他更好的方法吗?

谢谢。

【问题讨论】:

  • 选项 1 是更好的方法
  • 总是!!!总是!使用您提到的第一种方法!
  • 只是为了给你提供另一种选择,你可以这样做在 cellForRowAtIndexPath 中,将目标添加到视图中以处理点击事件...这样你可以直接捕捉到点击的响应在视图控制器内部
  • 选项 2 不好、脆弱且难以重复使用。

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


【解决方案1】:

您应该采用第一种方法。这样做的好处是您还可以将单元格中的一些数据传回视图控制器。

另一种选择是你可以做这样的事情

cellForRowAtIndexPath: 中,将目标添加到视图以处理点击事件。 通过这种方式,您可以直接捕获视图控制器内点击的响应。但是我会强调代表的第一种方法。

【讨论】:

  • 谢谢,但是如果我有许多其他不同的视图控制器会使用相同的自定义单元格,那么我需要在每个视图控制器中实现单元格的所有委托方法,对吗?这会导致更多重复代码吗?
  • 是的。您肯定必须在其他视图控制器中编写 use 委托方法,但我想我们都面临这样一个问题,即我们必须根据架构的要求冗余地编写部分代码
  • 谢谢,我会重写我的代码。之前我认为我不需要“重复我自己”,但我认为在这种情况下这是我们必须做的。
【解决方案2】:

在自定义表格视图单元格上进行用户操作是一种常见做法,并且根据 MVC,“视图”不应做出诸如显示什么、如何显示、何时显示之类的决定。 View 应该只知道它需要在什么条件下绘制什么东西。在您的情况下,根据 MVC,第一种方法是有意义的。将您的 ViewController 作为委托添加到 cellForRowAtIndexPath: 中的单元格,并在您的控制器中处理新视图控制器的推送!

【讨论】:

  • 谢谢,但是如果我有许多其他不同的视图控制器会使用相同的自定义单元格,那么我需要在每个视图控制器中实现单元格的所有委托方法,对吗?这会导致更多重复代码吗?
  • 是的,这对我来说很好。这种设计使代码可扩展且不易出现回归错误。当您的视图开始做出决定时,代码的可读性就会受到威胁......
  • 谢谢,我会重写我的代码。之前我认为我不需要“重复我自己”,但我认为在这种情况下这是我们必须做的。
猜你喜欢
  • 1970-01-01
  • 2010-11-24
  • 2015-12-06
  • 1970-01-01
  • 2012-04-30
  • 2013-03-25
  • 2012-09-03
  • 2011-03-01
  • 2012-11-19
相关资源
最近更新 更多