2014-09-27 2 views
3

Использование Xcode 6.0.1 ж/Swift Я создал ярлык в моей раскадровки и подключили его к ViewController.swift в результате:Xcode 6 Swift: Попытка сбросить IBOutlets в AppDelegate

@IBOutlet weak var myLabel: UILabel! 

Всякий раз, когда мое приложение на передний план я хочу сбросить myLabel.text в определенную строку, скажем, «Hello World».

Ранее в Objective-C Я мог бы сделать это в AppDelegate, как это:

- (void)applicationWillEnterForeground:(UIApplication *)application { 
[email protected]"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" 
} 

Но когда я запустить приложение вид отображается хорошо, затем я нажимаю «Домой», а затем возвращаюсь в приложение, а затем получаю сообщение об ошибке «Неустранимая ошибка: неожиданно обнаружена нуль при развертывании необязательного значения»

Итак, я понимаю, что UILabel является необязательным, и я Получая эту ошибку, потому что ее значение равно нулю. Но я не понимаю, почему его значение равно нулю, поскольку представление уже загружено. Я попытался использовать applicationDidBecomeActive с тем же результатом. Я не могу использовать viewDidLoad или viewWillAppear в классе ViewController, потому что эти методы не вызывают, когда приложение перемещается из фона в состояние переднего плана.

обновлен Также это

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

и достаточно уверенный, если утверждение ложно.

Любые идеи о том, как сбросить элементы пользовательского интерфейса в Xcode 6 и Swift? Благодарю.

ответ

0

Ваша проблема в том, что эта линия -

var vc: ViewController=ViewController() 

выделяет новый экземпляр ViewController. Он не предоставляет ссылку на экземпляр, который отображается на вашем раскадровке, и поскольку этот экземпляр не инициализирован из сцены раскадровки, поэтому все IBOutlet s равны нулю.

Я бы предложил вам разделить делегат приложения и контроллер вашего вида и воспользоваться преимуществами UIApplicationWillEnterForegroundNotification.

Где-то в вашей инициализации контроллера представления добавить

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

, а затем объявить функцию для обработки события

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

Я думал, что линия может быть моя проблема. Я пытался дублировать то, что AppDelegate имел в более ранних версиях. В .h он объявил экземпляр @property (сильный, неатомный) MADViewController * viewController; но в .m он добавил его как rootViewController. Я попытался просто получить доступ к rootViewController в AppDelegate, но не смог заставить это работать. Я попробую ваше предложение, но мне бы хотелось посмотреть, есть ли способ сделать это без уведомлений. Благодарю. – AJP

+0

Вы можете получить ссылку на фактический контроллер просмотра с помощью 'application.keyWindow.rootViewController', но подход к событиям, возможно,« лучше », поскольку он отделяет делегата вашего приложения и ваш контроллер представления. Это также упрощает для нескольких контроллеров просмотра ответ на возврат на передний план – Paulw11

+0

'application.keyWindow.rootViewController.myLabel.text =« Hello World »' не работает, он не может найти myLabel в корневом контроллере. Что мне не хватает? – AJP

Смежные вопросы