从应用程序委托不平衡调用开始/结束外观呈现模态视图

Posted

技术标签:

【中文标题】从应用程序委托不平衡调用开始/结束外观呈现模态视图【英文标题】:presenting modal view from app delegate unbalanced calls to begin/end appearance 【发布时间】:2011-12-15 14:30:03 【问题描述】:

这是我用来在应用首次启动时呈现模式视图的代码

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 

self.window.rootViewController = self.tabBarController;
[self.window makeKeyAndVisible];


Security *security = [[Security alloc] initWithNibName:@"Security" bundle:nil];
[self.tabBarController.selectedViewController presentModalViewController:security animated:YES];
[security release];

return YES;

日志是这样写的

Unbalanced calls to begin/end appearance transitions for <UITabBarController: 0x171320>.

有没有更好的方法来实现这一点?

我的应用委托中也有这个方法

    -(BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController 

    if (viewController == [tabBarController.viewControllers objectAtIndex:2]) 

        //The Log Out tab locks the app by presenting a modalviewcontroller that can't be dismissed unless there is a password.
        Security *security = [[Security alloc] initWithNibName:@"Security" bundle:nil];
        [self.tabBarController presentModalViewController:security animated:YES];
        [security release];
        return NO;

     else 

    return YES;
    

基本上,我的 tabbarcontroller 上的选项之一是注销按钮。上面的代码工作正常,不会向日志抛出警告。

【问题讨论】:

这个问题可能重复:***.com/questions/7886096/… 是的,这非常相似,但它不能解决我的问题。 你从哪个方法调用presentModalViewController 我已经更新了我的问题来回答你的问题;) 【参考方案1】:

你为什么从你的标签栏控制器展示它?假设您的上述代码来自 UIViewController,请尝试

[self presentModalViewController:security animated:YES];

[self.navigationController presentModalViewController:security animated:YES];

【讨论】:

这是我的应用委托。这只是 NSObject 这就是我从 tabbarcontroller 呈现的原因 将要存在于您的模态下的 viewController 放在上面,然后使用来自该 viewController 的上述调用来打开模态。那么当你关闭模态框时,viewController 已经在那里运行了。 所以你是说从 tabbarcontroller 中的一个视图控制器呈现第一个视图? 是的。打开一个默认视图控制器,如果在没有从标签栏中选择任何内容的情况下关闭模态框,该控制器将打开,然后打开模态框。 是的,所以基本上我就是这样做的。我的应用程序委托有一个名为 firstLaunch 的布尔值。 applicationDidFinishLaunch... 将其设置为 true。然后在 viewDidLoad 上的视图控制器(选项卡 1 视图控制器)中,它检查 appDelegate 以查看 (firstLaunch) 是否为真,如果是则显示模态视图。并立即将其设置为假。这种方法的唯一问题是用户可以在一秒钟内看到登录屏幕后面的内容。但它有效;)

以上是关于从应用程序委托不平衡调用开始/结束外观呈现模态视图的主要内容,如果未能解决你的问题,请参考以下文章

开始/结束外观转换的不平衡调用

CKPresentationControllerRootViewController 开始/结束外观转换的不平衡调用

开始/结束外观转换的不平衡调用...- UIViewController 包含

UISplitViewController 中对开始/结束外观转换的不平衡调用

对开始/结束外观转换的不平衡调用

使用故事板从应用程序委托呈现模态视图控制器