从 TabBarClass 调用视图控制器方法

Posted

技术标签:

【中文标题】从 TabBarClass 调用视图控制器方法【英文标题】:Calling View Controller Method From 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 每次都显示,但标签文本没有更新。 我敢肯定这很简单,但我想不出解决办法。

【问题讨论】:

【参考方案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;
);

【讨论】:

以上是关于从 TabBarClass 调用视图控制器方法的主要内容,如果未能解决你的问题,请参考以下文章

从模态视图控制器调用方法

从委托类调用视图控制器方法,有问题

如何从视图控制器中包含的视图调用方法?

从应用委托类调用视图控制器的方法

在显示另一个视图控制器的同时从一个视图控制器调用该方法

以正确的方式从视图中调用控制器方法