UITabBar 外观问题 + NSThreads

Posted

技术标签:

【中文标题】UITabBar 外观问题 + NSThreads【英文标题】:UITabBar appearance problem + NSThreads 【发布时间】:2009-11-06 19:32:47 【问题描述】:

我在尝试将 UITabBar 添加为 AppDelegate 窗口的子视图时遇到问题。 上面的链接显示了屏幕混乱状态的截图。

TabBarInAMessyState.png

结果是不可预测的。在这张图片中,只有 UITabBarItem 的标题受到影响,但有时 TabBar 背景不显示(因此我们可以看到窗口的背景)。有时 NavigationBar 也会受到影响(图中未显示)。

当我启动应用程序时,我首先要检查是否有网络连接,所以它被称为一个方法(verifyNetworkAvailability:),它将在与主线程不同的线程中运行。这样做是为了不冻结应用程序。

- (void)applicationDidFinishLaunching:(UIApplication *)application 
        [window makeKeyAndVisible];

        // check if there's network connection in another thread
        [NSThread detachNewThreadSelector: @selector(verifyNetworkAvailability:) toTarget:self withObject:self];
    

    - (void) verifyNetworkAvailability:(MyAppDelegate*) appDelegate 
        NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

        // Check if there's network connection..
        // If so, call the verifyNetworkAvailabilityDidEnd method 
        [appDelegate verifyNetworkAvailabilityDidEnd];

        [pool release];
    

    - (void) verifyNetworkAvailabilityDidEnd 
        [window addSubview:tabBarController.view];
    

我想知道是否可以通过这种方式添加 tabBarController.view(通过在主线程以外的线程中完成的方法调用)。

提前致谢

【问题讨论】:

【参考方案1】:

试试这个

- (void) verifyNetworkAvailability:(MyAppDelegate*) appDelegate 
    // other code here ...

    [appDelegate performSelectorOnMainThread:@selector(verifyNetworkAvailabilityDidEnd) withObject:nil waitUntilDone:NO];

【讨论】:

【参考方案2】:

当您尝试从除主线程之外的任何线程访问它时,UIKit 会遇到一些问题。考虑分派通知让您的主应用线程添加视图,而不是直接在辅助线程中添加视图。

【讨论】:

我尝试使用 NSNotificationCenter 但没有成功。有关详细信息,请参阅下面的帖子。

以上是关于UITabBar 外观问题 + NSThreads的主要内容,如果未能解决你的问题,请参考以下文章

UITabBar 项目位置问题 Xamarin

UITabBar项目位置问题Xamarin

自动引用计数 (ARC) 中的 NSThreads

Swift iOS UITabBar 自定义

Swift 中的外观代理 (iOS)

ios 4.3 中的标签栏项目外观