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

iOS应用程序是否需要视图控制器?,ios,objective-c,iphone,uiview,uiviewcontroller,Ios,Objective C,Iphone,Uiview,Uiviewcontroller,我一直在研究iOS应用程序的结构,并且几乎了解了MVC模式,包括代理、视图和控制器。然后我在网上遇到了一个示例,它只包含一个AppDelegate文件,没有视图、视图控制器或nib文件,并且可以工作: @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

我一直在研究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中设计应用程序并连接所有插座。或者您可以用代码设计窗口、标签等

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

self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
然后向其中添加一个视图:

[self.window addSubview: view];
和一个标签:

[view addSubview: label];
最后,显示窗口:

[self.window makeKeyAndVisible];

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


这个特定的示例只是在屏幕上绘制了几个元素,根本不可能进行交互。

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

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


还有一件事,请注意,这段代码只创建一个视图和一个标签。如果你想在你的函数中创建一个完整的应用程序,这段代码会非常大。想象成千上千行,你必须找到一个bug。那真的很难。正如你所说,MVC是一个范例。这是一种设置代码的方法,使其具有良好的内聚性和低耦合性。您可以对代码进行逻辑布局,以便业务逻辑在模型中,显示在视图中,连接的内容在控制器中。苹果公司的代码确实很难做到这一点,但从技术上讲,应用程序只需要视图,因为你仍然需要在屏幕上显示内容


这段代码只是创建一个窗口,然后向其中添加一个视图,该视图显示一些以编程方式设置的内容。它可以工作,但不是很好的做法,因为您不希望视图代码与应用程序代理耦合。

是的,
UIViewController
s根本不需要

您可以选择一些SVG用作背景,并添加一些按钮或
UIWebView
s以添加功能和其他
UIKit
元素

请记住,这是一种不值得推荐且难以维持的做法。如果您有几十个视图,那么最好开始使用
UIViewController
s。
其他阅读你的代码的人很难理解你的代码,没有人会真正喜欢它。

是的;它们不是必需的。你能更新一下你从哪里得到这些代码和信息的链接吗?我正在慢慢地得到它。那么AppDelegate是默认控制器?设置视图控制器或根视图控制器只是将该控制传递给另一个模块的一种方法?呃,我想OP会问应用程序是否需要它们,而不是“该代码如何工作?”。但不管怎样,你是对的。App委托是iOS调用的第一个对象。然后,它可以选择将每个UI元素的控件分配给视图控制器。在您的示例中,应用程序委托充当视图控制器本身。实际上,一个视图控制器只是一个对UI元素有引用的东西。@iSofia严格意义上没有根。每个视图控件负责自己的业务,并知道如何调用与之相关的其他视图控件。例如,您有一个包含5个项目的列表,点击其中一个项目,列表视图控制器将调用详细视图控制器以显示点击项目的详细信息。然后,当您点击“后退”时,详细视图控制器会记住列表视图控制器。@iSofia这应该可以回答您的问题:我看不到您在问题中输入的代码。@iSofia这是一个标签,不是一个按钮。@Glorfindel我为了这个问题缩短了它-添加回来。uitabarcontroller本身就是一个视图控制器。@Glorfindel Oops:P编辑。@GabrielTomitsuka Right。那么,设置视图控制器或根视图控制器实际上是做什么的呢?@iSofia它为MVC增加了一个抽象层。没什么了。@GabrielTomitsuka:对不起,你说的抽象层是什么意思?对,尤其是对于移动应用程序,模块化最好。非常感谢。