【问题标题】:ios Pass data from TabbarController to ViewController in Storyboardios 将数据从 TabbarController 传递到 Storyboard 中的 ViewController
【发布时间】:2014-07-17 00:10:56
【问题描述】:

我在 Storboard 编辑器中有一个带有 4 个选项卡的 TabBarController。当我选择第 4 个选项卡时,我想向其视图控制器发送一个字符串。在我的 TabbarController 类(名为 TabBarVC)中,我实现了以下方法:

- (void)tabBarController:(UITabBarController *)theTabBarController didSelectViewController:(UIViewController *)viewController {
    NSUInteger indexOfTab = [theTabBarController.viewControllers indexOfObject:viewController];
    if(indexOfTab == 3) {
        SupplierListVC *slvc = (SupplierListVC *) viewController;
        slvc.locationType = @"favorite";
        self.tabBarController.selectedViewController = slvc;
    }
}

这个方法被调用得很好,但是字符串没有被传递。调试的时候发现上面这段代码是在SupplierListVC的viewDidLoad之后调用的。我在这里做错了什么?选择选项卡时如何传递字符串?

【问题讨论】:

  • 您是否在代码中的其他任何地方实例化 SupplierListVC
  • 不,我没有实例化它。但是,正如我提到的,它连接到故事板中的 TabbarController,因此它会在 didSelectViewController 之前显示。
  • 忽略之前的评论。你检查过你的演员是否真的在工作吗?在演员阵容之后尝试NSLog("%s", NSStringFromClass(slvc.class)");并发布结果。
  • 他的所作所为并没有错。变量设置正确。他没有在正确的时间检查它。 viewDidLoad 将始终在标签栏中的 vc 上调用,在此方法之前,每个人都有机会触发,只要该 vc 保留在标签栏中,它的 viewDidLoad 将永远不会被再次调用。
  • @nhgrif - 你是对的。答案也很好。

标签: ios storyboard uitabbarcontroller


【解决方案1】:

如你所说,这个方法是在viewDidLoad之后调用的。方法名称本身应该告诉你:**DID**SelectViewController

过去时。英语可能不是您的第一语言,但是在使用 Apple 的方法名称时,要很好地理解英语动词时态真的非常非常非常非常非常长。他们没有误导。它们会在方法名称中准确地告诉您该方法的用途/用途/原因。

那么,字符串应该被适当地传递到视图控制器中——你可能只是在错误的时间检查它。

但是对于标签栏,它包含的视图控制器不会在每次切换到该标签时加载。选项卡会预加载一次,并且只有在标签栏控制器本身被关闭(或者视图控制器可能从标签栏控制器的视图控制器数组中删除)时才会被卸载。

你可以使用tabBarController:shouldSelectViewController:

这个方法,就像你正在使用的那样,给你一个标签栏控制器的引用,以及它试图切换的视图控制器。然而,它返回一个BOOL 值。如果您返回NO,则不会发生切换。如果需要,您可以随时返回 YES,但这里的要点是,此方法在切换开始之前调用,因此肯定在调用 viewWillAppearviewDidAppear 之前。

【讨论】:

  • 谢谢,现在是凌晨 4 点,您的精彩回答让我大开眼界,让我昏昏欲睡。
【解决方案2】:

在将数据从标签栏控制器传递到视图控制器时,我遇到了同样的问题。

NumberpadViewController *numpad= [[self viewControllers] objectAtIndex:1];
numpad.number=@"12345";

我在 viewdidload 方法中得到的数字是 nil。

- (void)viewDidLoad {
 NSLog(@"number@",number);//nil value
    }

所以我使用 viewdidappear 方法对数字数据进行处理。

-(void)viewDidAppear:(BOOL)animated{
   NSLog(@"number@",number);//12345
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-03
    • 2020-10-18
    • 1970-01-01
    • 2017-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多