如何从第一个选项卡更改 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 它在 BaseViewController
的 viewDidLoad
中;也许您可以在那里设置会员 ID 和其他内容,这是您的选择。
现在,在选项卡中使用的所有视图控制器,更改它们的 superclass(在文件顶部)。请使用您的 BaseViewController
,而不是 : UIViewController
。 Tadaa,他们总是有 MemberService 可用,无论有多少选项卡,您都会 100% 确定您有可用的服务,并且它已加载并准备好启动(因为它已在 viewdidLoad 中准备好)。
我 @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 它在 BaseViewController
的 viewDidLoad
中;也许您可以在那里设置会员 ID 和其他内容,这是您的选择。
现在,在选项卡中使用的所有视图控制器,更改它们的 superclass(在文件顶部)。请使用您的 BaseViewController
,而不是 : UIViewController
。 Tadaa,他们总是有 MemberService 可用,无论有多少选项卡,您都会 100% 确定您有可用的服务,并且它已加载并准备好启动(因为它已在 viewdidLoad 中准备好)。