我该如何从应用程序委托的视图中呈现模态视图控制器,即最顶部?我尝试从UIView中呈现模态视图控制器,这让我感到困惑。
我该如何从应用程序委托的视图中呈现模态视图控制器,即最顶部?我尝试从UIView中呈现模态视图控制器,这让我感到困惑。
使用你的rootViewController
。你可以从任何视图控制器子类中呈现模态视图控制器。如果你的根视图控制器是UITabBarController
,那么你可以这样做:
[self.tabBarController presentModalViewControllerAnimated:YES]
如果它是导航控制器:
[self.navigationController presentModalViewControllerAnimated:YES]
编辑:MVC
试图在视图中展示控制器会破坏MVC模式。一般来说,视图关注它的外观以及向其控制器公开接口以通信用户界面状态。例如,如果您在视图中有一个 UIButton
并且希望它呈现一个模态视图控制器,您不应该将视图与此进行硬编码。相反,当控制器实例化视图时,控制器通过将自己设置为接收 touchUpInside
操作的目标来配置按钮,在那里它可以呈现适当的模态视图控制器。
视图本身不应具有执行控制器工作的上下文知识。
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
应用程序代理不管理视图。您应该从第一个在-application:didFinishLaunchingWithOptions:
中显示在屏幕上的视图控制器的-viewDidAppear:
方法中呈现模态视图控制器。
rootViewController
呈现控制器,正如@XJones所指出的那样。OP似乎刚开始接触iOS开发,我正在尝试根据问题中提供的信息引导他走向最佳实践。应用程序委托膨胀已经过时了。 - Mark Adams
rootViewController
已经展示了一个模态视图控制器,此方法将无法工作。 - SteveUIWindow
的方法总是有效的,适用于所有情况,不需要自定义逻辑...就像UIAlertView
总是有效一样。 - SteveUIWindow
实现这一点。您的答案很好,但最适合 OP 的方法很难确定。他有多种解决问题的选择,我支持向他展示这些选项并鼓励正确理解和使用开发范例。 - XJones