iOS - 在选项卡栏中初始化视图控制器

3

我正在一个包含两个标签页的项目上工作。在我的第一个视图控制器中,我试图调用位于第二个视图控制器中的一个方法。第二个视图控制器上的方法会更新这个视图控制器上的一个UILabel。问题是第二个视图控制器在启动时并不会初始化,因此该方法无法正确调用。我可以使用以下代码手动初始化第二个视图控制器。

     if (secondView==nil) {
        secondView = [[SecondView alloc]init];
    }

然后启动该方法(通过在该方法上放置断点进行测试,并验证它确实触发),但我的UILabel没有更新,这使我相信第二个视图控制器在不同的线程上初始化。
我的问题是:如何在同一线程上初始化第二个视图控制器,以便单击该选项卡时UI将更新?是否有一种方法可以在appDelegate中完成这项工作?
我已经确认IBOutlet正确连接到标签,.h文件也正确导入,并且SecondViewController的方法在.H文件中声明。
以下是代码:
FirstViewController.m

-(void)myMethod
{
     [secondView updateLabel];
}

SecondViewController.m
-(void)updateLabel
{
    myLabel.text = myString;
}

你应该将函数放在一个集中的类/应用程序委托中,而不是调用其他视图控制器的方法。 - Raptor
所以,根据您的评论,直接调用另一个视图控制器的方法似乎不是恰当的礼仪?您能详细说明将此方法放在应用程序委托中的做法吗? - Fostenator
2个回答

4
我的问题是:如何在同一线程上初始化第二个视图控制器?
你不需要这样做。如果你的控制器在选项卡控制器中,那么每个选项卡的根控制器都会在启动时实例化。如果你需要引用它,那么可以使用类似self.tabBarController.viewControllers [1]的东西。这将是第二个选项卡中的控制器。你不想分配初始化一个新的 SecondView 实例。
即使你可以获得对 secondView 的正确引用,你尝试做的事情也不会起作用,因为 secondView 的视图还没有加载,因此尝试更新标签将不起作用。从你的问题中不清楚为什么你要从第一个控制器做这个,因为你没有传递任何东西。如果这是你想要做的全部,那么只需在 secondController 的 viewDidAppear 方法中更新标签。如果你确实想从第一个视图控制器传递一个字符串,那么你应该在 secondView 中拥有一个字符串属性,并从第一个控制器中设置该属性的值。然后,让 secondView 在 viewDidAppear 中将其标签的文本设置为该字符串的值。

感谢rdelmar!回答你的问题,第一个视图控制器正在设置单例对象中的NSString值,然后第二个视图控制器正在从同一单例中提取该值。我将我的初始问题保持相当“通用”,因为我不想添加太多细节。我只是不完全确定如何在选项卡栏情况下引用其他视图控制器或如何实例化不同的选项卡视图。我今天早上测试了你的解决方案,它对我起作用了。再次感谢你的帮助。 - Fostenator

0

AppDelegate 不应该在除了主线程以外的其他线程中执行,除非你正在创建自己的线程、使用操作或者尝试从异步回调(例如异步 URL 请求)中进行 UI 调用。

只是好奇... 你能否检查一下 myLabel 是否为 nil?另一个快速检查方法是在目标视图控制器的 init 方法中设置 myLabel 的值,而不是等待函数调用。

如果你确实有其他线程并且正在对 UI 进行调用,一个很好的切换到主线程的方法是使用 NSThread 类,像这样:

- (void) doSomethingOnUI:(NSString*) label{
   // if the calling thread is not the main thread
   if( ![NSThread isMainThread] )
   {
        // switch to the main thread
        [self performSelectorOnMainThread:@selector(doSomethingOnUI:) 
                               withObject:label 
                            waitUntilDone:YES];
        return;
   }

   [self.myLabel setText: label];
}

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