使用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元素?感谢。
答案 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"
}