Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 来自应用程序委派的presentModalViewController_Iphone_Objective C_Ios_Ipad - Fatal编程技术网

Iphone 来自应用程序委派的presentModalViewController

Iphone 来自应用程序委派的presentModalViewController,iphone,objective-c,ios,ipad,Iphone,Objective C,Ios,Ipad,如何从应用程序代理的视图(最上面的视图)显示模式视图控制器?试图从UIView显示模式视图控制器,这让我感到困惑。应用程序委托不管理视图。您应该从-viewdide:方法中显示模式视图控制器,该方法是在-application:didfishlaunchingwithoptions:中显示在屏幕上的第一个视图控制器。可以从任何视图控制器子类显示模态视图控制器。如果您的根VC是UITabBarController,则可以执行以下操作: [self.tabBarController presentM

如何从应用程序代理的视图(最上面的视图)显示模式视图控制器?试图从UIView显示模式视图控制器,这让我感到困惑。

应用程序委托不管理视图。您应该从
-viewdide:
方法中显示模式视图控制器,该方法是在
-application:didfishlaunchingwithoptions:
中显示在屏幕上的第一个视图控制器。可以从任何视图控制器子类显示模态视图控制器。如果您的根VC是UITabBarController,则可以执行以下操作:

[self.tabBarController presentModalViewControllerAnimated:YES]
或者,如果是导航控制器:

[self.navigationController presentModalViewControllerAnimated:YES]
等等

编辑:MVC

通过尝试从视图中呈现控制器,您正在打破MVC模式。通常,视图关注其外观和公开接口,以便将用户界面状态传达给其控制器。例如,如果视图中有一个
ui按钮
,并且希望它显示一个模态视图控制器,则不需要硬连线视图来实现这一点。相反,当控制器实例化视图时,控制器通过将自身设置为目标来配置按钮,以接收
touchUpInside
操作,在该操作中,控制器可以显示适当的模态视图控制器


视图本身没有(也不应该)这种上下文知识来执行控制器的工作。

最好的方法是创建一个新的
UIWindow
,设置它的
windowLevel
属性,并在该窗口中显示您的
UIViewController

这就是
UIAlertView
s的工作原理

接口

@interface MyAppDelegate : NSObject <UIApplicationDelegate>

@property (nonatomic, strong) UIWindow * alertWindow;

...

- (void)presentCustomAlert;

@end

实际上,我正试图从UIView中呈现一个modalViewController,并试图在最顶层的viewcontroller中呈现它,你知道吗?模态视图控制器只能由其他视图控制器呈现。他们管理的视图不知道自己的控制器,更不用说其他视图控制器了。虽然这个答案指出了OP的一些误解,但它并没有真正回答这个问题。请参阅我的回答:UIWindow创建一个新窗口,对于用户来说,功能等同于从@XJones指出的
rootViewController
显示一个控制器。OP似乎才刚刚开始iOS开发,鉴于问题中提供的信息,我正试图引导他走向最佳实践。去年应用程序代理膨胀。如果
rootViewController
已经呈现模式视图控制器,则不会。虽然我同意代码不应该出现在应用程序代理中,但向他展示如何将代码放在那里(他以后可以在其他地方重构代码)是完全可以接受的。如果
rootViewController
已经呈现了一个模态视图控制器,那么这就不起作用了。没错,这只是一个例子。我不知道OP应用程序的全部逻辑。也同意理解正确的技术更好,这样你可以在必要时完全了解你正在做的事情。基于
UIWindow
的方法总是全面有效,没有自定义逻辑。。。就像
UIAlertView
一样,总是有效的。这是假设OP想要这种行为。他可能也想要模态转换。如果编写代码,则可以使用
UIWindow
执行此操作。你的答案很好,什么对OP最好很难准确地辨别。他有多种选择来解决问题,我支持向他展示这些选择,并鼓励正确理解/使用开发范例。我同意XJones的观点。这是一个很好的答案,而且很有效。我经常用它。但是我不明白问题出在哪里:“试图从一个视图中呈现一个控制器,你正在打破MVC模式”,有人能用其他方式解释吗?谢谢
@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