如何从 Xcode 中的 AppDelegate.m 文件更新 UILabel 的文本?

Posted

技术标签:

【中文标题】如何从 Xcode 中的 AppDelegate.m 文件更新 UILabel 的文本?【英文标题】:how to update a UILabel's Text from AppDelegate.m file in Xcode? 【发布时间】:2014-08-30 14:51:50 【问题描述】:

我是 Objective-C 编程的新手。当应用程序进入后台时,我想从 UILabel 和至少 NSLog 中获取文本。但我得到的只是一个空值。(我不知道为什么!)。我正在使用故事板来创建视图和 UILabel,并且我使用 CTRL+Drag 将标签挂钩到我的代码并在实现文件中合成它。但我只是在 AppDelegate.m 代码中得到一个空值。

这些是我的代码:

ViewController.h:

@property (strong, nonatomic) IBOutlet UILabel *Mylabel;

ViewController.m:

@synthesize Mylabel;

AppDelegate.m:

#import "ViewController.h"

- (void)applicationDidEnterBackground:(UIApplication *)application

    ViewController * viewController = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];
    NSLog(@"%@",[[viewController Mylabel] text]);

【问题讨论】:

【参考方案1】:

您正在AppDelegate.mapplicationDidEnterBackground: 方法中创建一个新的ViewController 实例,而不是访问现有的实例。作为快速修复,您应该找到指向现有实例的 self.window.rootViewController 点。因此,将您的代码更改为:

NSLog(@"Label text is %@",self.window.rootViewController.Mylabel.text);

注意使用“点”符号来访问属性(这更容易)。仅供参考,传统上属性以小写字母开头;您可能想将 Mylabel 更改为 myLabel,以养成习惯!

【讨论】:

谢谢,这就是我想要的。谢谢你。但 TheGamingArt 有更好的答案【参考方案2】:
ViewController * viewController = (ViewController *)self.window.rootViewController;
NSLog(@"This is my text: %@", viewController.Mylabel.text);

由于您是 Objective-C 的新手,我将指出您不应该每次都将您的属性值大写(AKA Mylabel)。始终对属性和方法使用驼峰式大小写。方法使用 [ ] 调用,属性使用 。符号访问和设置。您也不需要合成 Mylabel,因为这是自动为您完成的。我建议查看raywenderlich.com 提供的 ios by Apprentice 书籍以了解最新情况。

【讨论】:

...好吧,通常我不会在意...但是为什么有人实际上对此投了反对票。如果有人不同意我上面所说的任何内容或我的回答,我希望得到一个很好的解释。特别是因为我上面所说的一切都是正确的,而我提到的方法是由 Apple 自己定义的。如果你对此投了反对票,请解释原因(不要误导新接触 Objective-C 的人) 没问题,祝我们在作为 Objective C(以及即将推出的 Swift)所熟知和喜爱的旅程中好运。

以上是关于如何从 Xcode 中的 AppDelegate.m 文件更新 UILabel 的文本?的主要内容,如果未能解决你的问题,请参考以下文章

从 AppDelegate 访问 View Controller 的属性

AppDelegate Touch3D Xcode - TabBar

Swift:从 AppDelegate 中的 UNTextInputNotificationAction 获取内容

Xcode 5 - iOS - 如何在没有 Storyboard 或 XIB 的情况下在 Xcode 中创建视图控制器以及如何将其配置为 AppDelegate 作为根视图

AppDelegate.swift 如何在 Xcode 6.3 中替换 AppDelegate.h 和 AppDelegate.m

从 AppDelegate 调用 GameScene 方法(Swift 3、SpriteKit、Xcode 8)