如何从第一个选项卡更改 tabbarcontroller 所有选项卡的变量?

How to change the variable of all tabs of the tabbarcontroller from first tab?

@property NSString *memberid;tabbarcontrller

我会在所有的viewcontorllers中使用它。

我想用 viewcontroller 之一更新 memberid。以便其他视图控制器可以使用新值。

如何更新 NSString

// 在 AppDelegate 中为 tabcontroller 赋值一个变量,将你的 tabcontroller 分配给这个变量,您可以 tabcontroller 使用整个应用程序。示例代码在这里

Appdelegate *appdelegate = [[UIApplication sharedApplication] delegate];

appdelegate.tabController.memberid = @"1";

我正在我的一个项目中做这样的事情,

NSArray *tabArr = [self.tabBarController viewControllers];

UINavigationController *navController1 = [tabArr objectAtIndex:1];

DraftViewController *dvc = [navController1.viewControllers firstObject];

dvc.screenTitle = self.screenTitle;


UINavigationController *navController3 = [tabArr objectAtIndex:3];
SentViewController *svc = [navController3.viewControllers firstObject];

svc.screenTitle = self.screenTitle;

UINavigationController *navController2 = [tabArr objectAtIndex:2];
OutboxViewController *ovc = [navController2.viewControllers firstObject];

ovc.screenTitle = self.screenTitle;

我正在我的第一个选项卡中这样做(tabbarcontroller 的第一个 viewcontroller)

我已将 navigationcontroller 嵌入每个 viewcontroller(选项卡)。所以,我得到第一个导航控制器,然后得到 VC(tab).

如果您没有将导航控制器嵌入到您的选项卡中 VC 然后 [tabArr objectAtIndex:index] returns 直接查看控制器。

不要听其他人的,他们只是在给你灌输坏习惯。没有冒犯,但硬编码的东西不是它的工作原理。这不是其中任何一个的工作原理。

一个简单易行的解决方案可能是添加一个 class、某种 "Manager" 或 "Service"。你可以称它为 MemberService。这个class'的工作是让所有的工作都与你的会员相关。我不知道你的应用程序,但对于你所问的,这个假设就足够了。当然可以随意调整。

此 class 可能是单例,具体取决于 Member 的工作方式。如果您有多个成员,您可以在该服务中有一个成员列表 class,或者只是一个包含您需要的值的 属性。

在这里,我将采用最简单的方法,假设有一个成员,这样您就可以简单地拥有一个(常量?)字段来保存成员 ID。

现在该服务只需要在您的控制器中可用,您可以在那里询问 "Hey service, what's the ID number?",无论您从哪里询问,他都会回复。使用该架构,您可以从 20 个不同的选项卡中询问 5 次,它始终有效。无需混合使用导航控制器和诸如此类的东西。

您 UI 不应该负责管理您的逻辑。控制器处理视觉效果、动画等。所有其余部分都应按逻辑 classes(视图模型、服务等)移动。

现在,在多个不同的控制器中使用相同的 属性(甚至是单例)可能会有点烦人,您仍然必须每次都写下 属性。比上述更清洁的解决方案是 subclassing 你的 UIViewControllers.

就这么简单:创建一个... BaseViewController(你可以找到比这更性感的名字)继承:UIViewController。添加一个 属性,你的单例服务,MemberService,并确保 instantiate/prepare 它在 BaseViewControllerviewDidLoad 中;也许您可以在那里设置会员 ID 和其他内容,这是您的选择。

现在,在选项卡中使用的所有视图控制器,更改它们的 superclass(在文件顶部)。请使用您的 BaseViewController,而不是 : UIViewController。 Tadaa,他们总是有 MemberService 可用,无论有多少选项卡,您都会 100% 确定您有可用的服务,并且它已加载并准备好启动(因为它已在 viewdidLoad 中准备好)。