Использование 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? Благодарю.
Я думал, что линия может быть моя проблема. Я пытался дублировать то, что AppDelegate имел в более ранних версиях. В .h он объявил экземпляр @property (сильный, неатомный) MADViewController * viewController; но в .m он добавил его как rootViewController. Я попытался просто получить доступ к rootViewController в AppDelegate, но не смог заставить это работать. Я попробую ваше предложение, но мне бы хотелось посмотреть, есть ли способ сделать это без уведомлений. Благодарю. – AJP
Вы можете получить ссылку на фактический контроллер просмотра с помощью 'application.keyWindow.rootViewController', но подход к событиям, возможно,« лучше », поскольку он отделяет делегата вашего приложения и ваш контроллер представления. Это также упрощает для нескольких контроллеров просмотра ответ на возврат на передний план – Paulw11
'application.keyWindow.rootViewController.myLabel.text =« Hello World »' не работает, он не может найти myLabel в корневом контроллере. Что мне не хватает? – AJP