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

时间:2014-09-27 22:01:44

标签: ios swift xcode6

使用Xcode 6.0.1 w / 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";
}

但是我很难在Swift中使用Xcode 6。因为AppDelegate没有设置视图控制器的实例,所以我在AppDelegate中定义了它:

class AppDelegate: UIResponder, UIApplicationDelegate {

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

然后尝试了同样的方法:

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

但是当我运行应用程序时,视图显示正常,然后我点击主页,然后返回到应用程序,然后我收到错误"致命错误:在解开可选值时意外发现nil&# 34;

所以我理解UILabel是可选的,我收到此错误,因为它的值为nil。但我不明白为什么它的值为零,因为视图已经加载。我尝试过使用带有相同结果的applicationDidBecomeActive。我无法在ViewController类中使用viewDidLoad或viewWillAppear,因为当应用程序从后台移动到前台状态时,不会调用这些方法。

还将此更新为

    if vc.myLabel != nil {
        vc.myLabel.text="Hello World"
    }

并确定if语句是错误的。

如何重置Xcode 6和Swift中的UI元素?感谢。

1 个答案:

答案 0 :(得分:0)

你的问题是这一行 -

var vc: ViewController=ViewController()

分配ViewController的新实例。它不提供对故事板中显示的实例的引用,并且由于此实例未从故事板场景初始化,因此所有IBOutlet都为零。

我建议您将应用代理与视图控制器分离,并利用 UIApplicationWillEnterForegroundNotification

在初始化视图控制器的某处添加

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

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

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