Xcode 6 Swift: 尝试在AppDelegate中重置IBOutlets

3

我使用Xcode 6.0.1和Swift创建了一个标签并将其连接到ViewController.swift,结果如下:

@IBOutlet weak var myLabel: UILabel!

每当我的应用程序进入前台,我希望将myLabel.text重置为特定的字符串,比如"Hello World"。
以前在Objective-C中,我可以在AppDelegate中这样做:
- (void)applicationWillEnterForeground:(UIApplication *)application {
self.viewController.myLabel.text=@"Hello World";
}

但是我在Xcode 6中用Swift语言实现这个功能时遇到了困难。因为AppDelegate没有设置视图控制器的实例,所以我在AppDelegate中定义了它:

class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?
    var vc: ViewController=ViewController()

然后尝试同样的方法:

func applicationWillEnterForeground(application: UIApplication) {
    vc.myLabel.text="Hello World"
}

但是,当我运行应用程序时,视图正常显示,然后我按下Home键,再次进入应用程序时,我会收到错误消息“fatal error: unexpectedly found nil while unwrapping an Optional value”。
因此,我了解到UILabel是可选的,并且由于其值为nil,因此出现了此错误。但我不明白为什么它的值为nil,因为视图已经加载。我尝试使用applicationDidBecomeActive,但结果相同。我不能在ViewController类中使用viewDidLoad或viewWillAppear方法,因为当应用程序从后台转换到前台状态时不会调用这些方法。
同时更新了此内容
    if vc.myLabel != nil {
        vc.myLabel.text="Hello World"
    }

确认一下,if语句是错误的。

有没有想法如何在Xcode 6和Swift中重置UI元素?谢谢。

1个回答

0

你的问题在于这一行代码 -

var vc: ViewController=ViewController()

分配一个新的ViewController实例。它不提供对从你的storyboard显示的实例的引用,因为这个实例没有从storyboard场景初始化,所以所有的IBOutlet都是空的。

我建议您将您的应用程序委托和视图控制器解耦,并利用UIApplicationWillEnterForegroundNotification

在您的视图控制器的初始化中的某个地方添加:

NSNotificationCenter.defaultCenter().addObserver(self, selector: "enterForeground", name:UIApplicationWillEnterForegroundNotification, object: nil)

然后声明一个函数来处理该事件

func enterForeground {
   self.myLabel.text="Hello world"
}

我认为这一行可能是我的问题。我试图复制AppDelegate在早期版本中所拥有的内容。在.h文件中,它声明了实例@property (strong, nonatomic) MADViewController *viewController;,但是在.m文件中,它将其添加为rootViewController。我试图只访问AppDelegate中的rootViewController,但无法使其工作。我会尝试您的建议,但我很想知道是否有一种不使用通知的方法来完成它。谢谢。 - AJP
你可以使用 application.keyWindow.rootViewController 获取实际视图控制器的引用,但事件方法可能更好,因为它将您的应用程序委托和视图控制器解耦。这还使得多个视图控制器能够简单地响应返回前台。 - Paulw11
application.keyWindow.rootViewController.myLabel.text="Hello World" 这段代码无法正常工作,因为它找不到 rootViewController 上的 myLabel。我漏掉了什么? - AJP
你需要将 rootViewController 强制转换为 ViewController 的实例,因为普通的 UIViewController 不知道 myLabel。例如:let vc=application.keyWindow.rootViewController as ViewController; vc.myLabel.text="hello world" - Paulw11
没错,就是这个,非常感谢 @Paulw11。我猜这就是因为我没有阅读整本Swift编程指南而导致的。在自动引用计数(ARC)这里卡住了 :-) - AJP

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接