我有一个UIViewcontroller,比如说有一个UILabel的“ DialerViewController” @IBOutlet弱var statusText:UILabel! , 它的默认值为“待处理”,我如何使用应用程序委托来更改statusText的值,假设应用程序委托从服务器下载了文本,并且在完成后需要更新statusText。
我不熟悉快速发展,解决此问题的最佳方法是什么?
答案 0 :(得分:2)
如果DialerViewController
是应用程序中唯一的视图控制器,则可以这样处理...
(window?.rootViewController as? DialerViewController)?.statusText?.text = "YOURTEXT"
另一种选择是使DialerViewController
实例遵守一些特定的通知,并在从服务器上下载文本时将该通知发布到应用程序委托中。
// create an extension for your own notification
extension Notification.Name {
static let textWasDownloadedNotification = Notification.Name("textWasDownloadedNotification")
}
class DialerViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// make your dialer view controller listen to your new notification
NotificationCenter.default.addObserver(self, selector: #selector(updateLabel), name: .textWasDownloadedNotification, object: nil)
}
// function that gets called when a notification is received
@objc func updateLabel(_ notification: Notification) {
// get the new text from the notification's `userInfo` dictionary
let text = notification.userInfo?["text"] as? String
// update the label
statusText.text = text
}
}
// somewhere in your app delegate...
// prepare the `userInfo` dictionary with the information that is needed
let userInfo = ["text": "This is the new text."]
// post the notification
NotificationCenter.default.post(name: .textWasDownloadedNotification,
object: nil,
userInfo: userInfo)
请参见https://developer.apple.com/documentation/foundation/notificationcenter。
答案 1 :(得分:0)
我认为您无法做到这一点,因为AppDelegate方法是在应用程序的特定状态下调用的,而其中一种可能是好的:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool
但是调用它时,您的viewController尚未加载。
答案 2 :(得分:0)
从网络加载不是AppDelegate的责任,添加新的网络服务类并将其注入到视图控制器中。只需掌握有关图层体系结构的知识即可。对于新开发者来说功能非常强大,祝您好运。