从应用程序委托中presentModalViewController

11

我该如何从应用程序委托的视图中呈现模态视图控制器,即最顶部?我尝试从UIView中呈现模态视图控制器,这让我感到困惑。

3个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
12

使用你的rootViewController。你可以从任何视图控制器子类中呈现模态视图控制器。如果你的根视图控制器是UITabBarController,那么你可以这样做:

[self.tabBarController presentModalViewControllerAnimated:YES]

如果它是导航控制器:

[self.navigationController presentModalViewControllerAnimated:YES]

编辑:MVC

试图在视图中展示控制器会破坏MVC模式。一般来说,视图关注它的外观以及向其控制器公开接口以通信用户界面状态。例如,如果您在视图中有一个 UIButton 并且希望它呈现一个模态视图控制器,您不应该将视图与此进行硬编码。相反,当控制器实例化视图时,控制器通过将自己设置为接收 touchUpInside 操作的目标来配置按钮,在那里它可以呈现适当的模态视图控制器。

视图本身不应具有执行控制器工作的上下文知识。


3
如果 rootViewController 已经展示了一个模态视图控制器,此方法将无法工作。 - Steve
是的,这只是一个例子。我不知道OP的应用程序的完整逻辑。同时,我同意理解正确的技术更好,这样当必要时你就可以有充分的知识去偏离它。 - XJones
一个基于 UIWindow 的方法总是有效的,适用于所有情况,不需要自定义逻辑...就像 UIAlertView 总是有效一样。 - Steve
假设 OP 想要这种行为。他可能也想要模态转换。如果您编写代码,可以使用 UIWindow 实现这一点。您的答案很好,但最适合 OP 的方法很难确定。他有多种解决问题的选择,我支持向他展示这些选项并鼓励正确理解和使用开发范例。 - XJones
我同意XJones的观点。这是一个好答案,而且它有效。我经常使用它。但是我不明白为什么会有问题:“通过在视图中尝试呈现控制器,您正在破坏MVC模式”。有人能用其他方式解释一下吗?谢谢。 - Frade
MVC = Model/View/Controller。这是iOS应用程序中使用的设计模式。该主题过于庞大,无法在此详细讨论。简单来说,它定义/强制执行了模型(数据)、视图(UI)和控制器(应用逻辑)之间的分离。 - XJones

10
创建一个新的 UIWindow,设置它的 windowLevel 属性,并在该窗口中呈现您的 UIViewController 是最好的方法。这就是 UIAlertView 的工作原理。 界面
@interface MyAppDelegate : NSObject <UIApplicationDelegate>

@property (nonatomic, strong) UIWindow * alertWindow;

...

- (void)presentCustomAlert;

@end

实现:

@implementation MyAppDelegate

@synthesize alertWindow = _alertWindow;

...

- (void)presentCustomAlert
{
    if (self.alertWindow == nil)
    {
        CGRect screenBounds = [[UIScreen mainScreen] bounds];
        UIWindow * alertWindow = [[UIWindow alloc] initWithFrame:screenBounds];
        alertWindow.windowLevel = UIWindowLevelAlert;
    }

    SomeViewController * myAlert = [[SomeViewController alloc] init];
    alertWindow.rootViewController = myAlert;

    [alertWindow makeKeyAndVisible];
}

@end

6

应用程序代理不管理视图。您应该从第一个在-application:didFinishLaunchingWithOptions:中显示在屏幕上的视图控制器的-viewDidAppear:方法中呈现模态视图控制器。


我正在尝试从一个UIView中呈现modalViewController,并尝试在最顶层的viewcontroller上呈现它,有什么想法吗? - adit
1
模态视图控制器只能由其他视图控制器呈现。它们管理的视图不知道自己的控制器,更不用说其他视图控制器了。 - Mark Adams
虽然这个答案指出了一些OP的误解,但它并没有真正回答问题。请参见我的答案关于UIWindow的内容。 - Steve
创建一个新窗口,在用户看来,功能上等同于从rootViewController呈现控制器,正如@XJones所指出的那样。OP似乎刚开始接触iOS开发,我正在尝试根据问题中提供的信息引导他走向最佳实践。应用程序委托膨胀已经过时了。 - Mark Adams
如果你要重写viewDidAppear:方法,请确保调用了super。 - eulr
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,