【问题标题】:Calling View Controller Method From TabBarClass从 TabBarClass 调用视图控制器方法
【发布时间】:2017-03-18 11:18:33
【问题描述】:

我有一个在标签栏类中运行的计时器,每次调用它时都会将数据保存到云中。然后我希望它在当前选择的视图控制器上调用一个方法来告诉用户保存了什么。我正在执行以下操作。

    if (self.selectedIndex == 1) {
    MessagesViewController *msgView = [[MessagesViewController alloc]init];
    NSLog(@"Running");
    [msgView testMethod];

}

这是有效的,如果它是选择选项卡,则调用该方法。

NSString *teststring = [formatter stringFromDate:todaysDate];
NSLog(@"%@", teststring);

self.TestLab.text = teststring;

NSlog 每次都显示,但标签文本没有更新。 我敢肯定这很简单,但我想不出解决办法。

【问题讨论】:

    标签: ios objective-c xcode storyboard


    【解决方案1】:

    这个

    MessagesViewController *msgView = [[MessagesViewController alloc]init];
    

    分配MessagesViewController 的新实例。它不会为您提供对当前活动的视图控制器实例的引用。该方法在这个新实例上执行,因此您会得到 NSLog 输出,但文本字段可能是 nil 并且至少不在屏幕上。

    您可以使用UITabBarControllerselectedViewController 属性来获取当前选定的视图控制器。

    if (self.selectedIndex == 1) {
        MessagesViewController *msgView = (MessagesViewController *)self.selectedViewController;
        NSLog(@"Running");
        [msgView testMethod];
    }
    

    【讨论】:

    • 谢谢。正是我想要的。它现在让我想,如果我需要从 MessagesViewController 获取 tabar 类的当前实例,是否有类似的调用 self.selectedViewController?
    • self.parent 应该给你标签栏控制器
    • 也工作过。谢谢
    【解决方案2】:

    既然是计时器,它可能在另一个线程上?并且您不能在主线程以外的任何其他线程中更新 UI。试试这个:

    dispatch_async(dispatch_get_main_queue(), ^{
      self.TestLab.text = teststring;
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-26
      • 2023-03-05
      • 1970-01-01
      相关资源
      最近更新 更多