【问题标题】:Are View Controllers required for an iOS App?iOS 应用程序是否需要视图控制器?
【发布时间】:2015-07-24 22:03:22
【问题描述】:

我一直在研究 iOS 应用程序结构,几乎完全理解了 MVC 范式,包括代理、视图和控制器。然后我在网上看到了一个例子,它只包含一个 AppDelegate 文件,没有视图、视图控制器或 nib 文件,它可以工作:

    @implementation AppDelegate

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

        self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
        self.window.backgroundColor = [UIColor whiteColor];

        CGRect bounds = self.window.bounds;
        view = [[UIView alloc] initWithFrame: bounds];
        [view setBackgroundColor: [UIColor yellowColor]];
        [self.window addSubview: view];

        CGRect labelFrame = CGRectMake(30, 30, 100, 30);
        label = [[UILabel alloc] initWithFrame: labelFrame];
        [label setText: @"My Label"];
        [label setTextAlignment: NSTextAlignmentCenter];
        [label setTextColor: [UIColor orangeColor]];
        [view addSubview: label];

        CGRect buttonFrame = CGRectMake(vCentre - 50, hCentre - 20, 100, 30);
        button = [[UIButton alloc] initWithFrame: buttonFrame];
        [button setTitle: @"My Button" forState: UIControlStateNormal];
        [[button titleLabel] setTextAlignment: NSTextAlignmentCenter];
        [button setTitleColor: [UIColor redColor] forState: UIControlStateNormal];
        [view addSubview: button];

        [button addTarget:self action:@selector(buttonClicked:) forControlEvents: UIControlEventTouchDown];

        [self.window makeKeyAndVisible];

        return YES;
    }

在没有设置任何视图控制器或根视图控制器的情况下如何工作?这是否意味着实际上并不需要视图控制器?

【问题讨论】:

  • 是的;它们并不是真正需要的。
  • 能否更新您获取此代码和信息的链接?

标签: ios objective-c iphone uiview uiviewcontroller


【解决方案1】:

是的,UIViewControllers 根本不需要!

您可以选择一些 SVG 作为背景并添加一些按钮或 UIWebViews 来添加功能和其他 UIKit 元素。

请记住,这是一种不推荐且难以维护的做法。如果您有数十个视图,那么开始使用UIViewControllers 可能是个好主意。 阅读您的代码的其他人将很难理解它,而且没有人会真正对它感到满意。

【讨论】:

  • UITabBarController 本身就是一个视图控制器。
  • @Glorfindel 哎呀:P 已编辑。
  • @GabrielTomitsuka 对。那么设置视图控制器或根视图控制器实际上是做什么的呢?
  • @iSofia 它为您的 MVC 添加了一个抽象层。不多了。
  • @GabrielTomitsuka:抱歉,抽象层是什么意思?
【解决方案2】:

正如您所说,MVC 是一种范式。这是一种设置代码的方法,使其具有良好的内聚性和低耦合性。您可以对代码进行逻辑布局,以便业务逻辑在模型中,显示在视图中,而连接的东西在控制器中。 Apple 通过他们的代码非常努力地推动了这一点,但从技术上讲,应用程序只需要视图,因为您仍然需要在屏幕上显示内容。

这段代码只是创建了窗口,然后向它添加了一个视图,它显示了一些以编程方式设置的内容。它有效,但不是一个好的做法,因为您不希望您的视图代码与您的应用委托耦合。

【讨论】:

    【解决方案3】:

    正如您在此处看到的,这背后的开发人员正在直接从代码中创建所有视图。您可以这样做,因为您可以在一个视图控制器中完成所有逻辑,而无需任何模型。事实上,您可以根据需要创建应用程序。如果需要,您可以在 Web 视图中使用 html 和 css 创建整个应用程序。 Objective-c 或任何其他语言对此没有任何限制。如果您想在代码中违反任何原则,您可以这样做。

    这就是最佳实践的用武之地。您不应该在 App 委托中创建所有内容,您不应该只有一个故事板(我对团队工作的看法),基本上您应该使用被证明是好的东西开发和管理应用的方法。

    还有一点,注意这段代码只创建了一个视图和一个标签。如果你想在你的函数中创建整个应用程序,这段代码会非常大。想象成千上万行,你必须找到一个错误。那真的很难。

    【讨论】:

    • 对,尤其是对于移动应用程序 - 模块化是最好的。谢谢。
    【解决方案4】:

    虽然不需要使用视图控制器,但它们构成了应用程序的非常逻辑划分。它们还有助于使用故事板来实现应用用户界面的图形化设计。

    这个特殊的例子只是在屏幕上绘制了几个元素,根本没有交互的可能。

    【讨论】:

    • 我在您提出问题的代码中看不到这一点。
    • @iSofia 这是一个标签,而不是一个按钮。
    • @Glorfindel 我为这个问题缩短了它 - 加回来了。
    【解决方案5】:

    您可以在 Interface Builder 中设计应用程序并连接所有插座。或者您可以在代码中设计窗口、标签等。

    这会创建一个填充屏幕的窗口:

    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    

    然后给它添加一个视图:

    [self.window addSubview: view];
    

    还有一个标签:

    [view addSubview: label];
    

    最后,显示窗口:

    [self.window makeKeyAndVisible];
    

    【讨论】:

    • 我慢慢明白了。那么 AppDelegate 是默认控制器吗?而设置视图控制器或根视图控制器只是将控制权传递给另一个模块的一种方法?
    • 嗯,我以为 OP 会问他们是否在应用程序上必要,而不是“这段代码是如何工作的?”。但无论如何。
    • @iSofia 你是对的。 App Delegate 是 iOS 调用的第一个对象。然后它可选地将每个 UI 元素的控制权分配给视图控制器。在您的示例中,App Delegate 本身充当视图控制器。实际上,视图控制器只是引用了您的 UI 元素的东西。
    • @iSofia 严格来说没有根。每个视图控件都关心自己的事务,并且知道如何调用与其相关的其他控件。一个例子是你有一个包含 5 个项目的列表,你点击一个,List View Controller 将调用 Detail View Controller 来显示被点击项目的详细信息。然后,当您点击“返回”时,详细视图控制器会记住列表视图控制器。
    • @iSofia 这应该回答你的问题:stackoverflow.com/questions/5842087/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 2014-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多