我想从您知道的另一个控制器更改标签的文本,例如定义全局变量。
5 回答
在 AppDelegate 中定义并创建其属性并分配 UILabel
现在在整个应用程序中您想要的任何地方使用该标签
AppDelegate *objAppDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
[self.view addSubView:objAppDelegate.label] // your gobal label added
在任何地方更改其文本
[objAppDelegate.label setText:@"New Text"];
有多种方法可以做到这一点。不过,您可以更具体地表达您的问题。
您可以使其他视图控制器可以访问您的标签。这样做你需要知道你想从哪里访问标签的拥有视图控制器。
或者,您可以在 UIApplicationDelegate 的子类中存储对标签的引用,并使用 [[UIApplication getSharedApplication] delegate] 访问它并从任何地方访问它。如果您这样做,请不要忘记在标签被销毁时取消该引用。
但是,在不知道您想要实现什么以及为什么的情况下,我不能说这是否是可取的,使 UILable 对象可以从其视图的控制器外部访问。很可能不是。
a) 将指向标签的指针传递给控制器 B 并使用它来更改文本。
b) 定义协议并在控制器 B 中定义委托成员。在控制器 A(拥有标签)中实现委托方法,并将传递的文本设置为委托方法的参数。调用控制器 B 中的委托方法并将要设置的文本传递给标签。
c) 将控制器 A 注册为某个通知的观察者。在控制器 B 中发布通知并将文本添加到用户信息字典。在控制器 A 中实现一个方法,该方法接收通知并设置在用户信息字典中传递的文本。
b) 在大多数情况下是最合理的。a) 不干净。c) 是矫枉过正。
随着 iOS 5 引入自动引用计数,强制某些编程规则和限制,某些编程结构和公认的做法不再可能。extern 的使用是链接器不赞成的基于 C 的指令之一。实际上,如果您尝试在启用 ARC 的情况下使用,您将收到链接错误。
但是,在 iOS 5 中使用全局变量仍然是很有可能的,您只需使用 #define 指令即可。
以下步骤演示了一种使用全局变量的可能解决方案。
1)声明一个全局变量:
NSString * gvar;
@interface AppDelegate : UIResponder <UIApplicationDelegate>
2)初始化全局变量:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// Override point for customization after application launch.
gvar = [[NSString alloc] initWithString:@"Name1"];
return YES;
}
3)在您的两个 ViewController 中导入此 AppDelegate 文件。
4)在您的第一个 ViewController 中将 gvar 分配给 UILabel :
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
self.label.text= gvar;
}
5)从您的第二个 ViewController 更改其值:
gvar = [self.songArray objectAtIndex:indexPath.row];
一旦你回到之前的 viewController,你的标签就会显示新的文本。
我认为你最好使用协议来做到这一点