我是iOs应用程序开发的新手,我想知道我的应用程序架构是否正确。应用程序中的错误使我相信我的某些变量已多次初始化。
总结我的应用程序:2个屏幕和2个视图,但只有一个控制器。根据当前视图,viewDidLoad具有不同的结果。 我不认为这是正确的做法。我想这个想法是为每个视图创建一个控制器?
但是我主要关心的是:在viewDidLoad中,加载主屏幕时,我设置了一个通知观察器。我相信(由于错误),每次屏幕加载时都会设置此观察器,然后多次调用它。
我的问题在这里:在哪里放置此侦听器,是否有一个位置仅在加载此视图后才运行代码?应该通过将此侦听器放入变量中来解决此问题?
AppDelegate应用程序功能是否适合此类情况?
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
// Remove iphone sleep mode
UIApplication.shared.isIdleTimerDisabled = true
//Setup the external scanner object
self.scanner.delegate = self
self.scanner.connect()
// Init the saved values
let defaults = UserDefaults.standard
// --------------- MAIN VIEW ---------------
if(mainView != nil){
// Add a notification receiver
// Will receive results ### request
NotificationCenter.default.addObserver(self, selector: #selector(mainTextNewLineNotification), name: Notification.Name(rawValue: "sendingToView"), object: nil)
// Layout setup
mainTextView.layer.cornerRadius = 6.0
[...]
}
// --------------- SETTINGS VIEW ---------------
if(settingsView != nil){
//Fill the field with saved values
inputHost.text = defaults.string(forKey: "hostname")
inputPort.text = String(defaults.integer(forKey: "port"))
if(defaults.string(forKey: "timeout") != nil){
inputTimeout.text = defaults.string(forKey: "timeout")
}
if(UserDefaults().string(forKey: "confirmSwitch") == "On"){
confirmSwitch.isOn = true
} else {
confirmSwitch.isOn = false
}
}
}
答案 0 :(得分:0)
在这种情况下,您无需关心removeObserver逻辑(因为您使用的是-selector而不是-block的简单预订)。从苹果doc: 如果您的应用程序针对iOS 9.0和更高版本或macOS 10.11和更高版本,则无需在其dealloc(deinit)方法中注销观察者。
每次初始化UIViewController
的实例时,如果系统加载了它的视图,则每次都会调用viewDidLoad。在UIViewController
生命周期内, viewDidLoad 被称为一次。因此,您的订阅逻辑是正确的。
我不知道您的应用程序的完整逻辑,因此很难找出错误的原因。