iOS 应用程序是否需要视图控制器?

Are View Controllers required for an iOS App?

我一直在研究 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;
    }

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

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

这将创建 window 填充屏幕:

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

然后给它添加一个视图:

[self.window addSubview: view];

还有一个标签:

[view addSubview: label];

最后,显示 window:

[self.window makeKeyAndVisible];

虽然不需要使用视图控制器,但它们弥补了应用程序的非常 逻辑划分。它们还促进了故事板的使用,以允许对应用程序的用户界面进行图形设计。

此特定示例仅在屏幕上绘制了几个元素,根本无法进行交互。

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

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

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

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

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

是的,UIViewController根本不需要!

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

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