NotificationCenter 不会在第一次加载新视图时传递数据,但它每隔一段时间传递一次
NotificationCenter doesn't pass the data with first loading of the new view but it does every other time
希望有人能帮助我解决我的问题。我是一个初学者程序员,这是我尝试构建的第一个认真的应用程序,所以如果我没有提供足够的信息或代码,请理解并随时指出。
我正在尝试使用通知控制器在视图控制器之间传递数据。很快这就是它的工作方式:
按下 MainVC 上的编辑按钮后,它应该传递通知并转到编辑VC,在那里应该接收数据并稍后在该视图上使用。
我遇到的问题是 EditVC 似乎在第一次加载时没有接收到数据,但如果我返回并再次按下按钮,它就可以正常工作。
有什么建议为什么它没有第一次加载吗?
我试图将观察者从 viewDidLoad 移动到 viewDidAppear 并将通知 post 移动到不同的时刻(值得一提:现在它在我长按单元格后得到 posted,长按实现的是显示要编辑或删除的其他按钮,我选择这一刻是因为我想使用该通知传递来自活动单元格的所有数据,并且也会在其他地方使用相同的通知,这个特定的 segue 在按下编辑按钮后执行)就像移动它到 editButtonPressed 功能或准备 segue 功能,但效果是一样的。我在这里错过了什么?
这是我的代码片段:
编辑VC
class EditVC: UITableViewController {
override func viewDidLoad() {
startObserving()
}
func startObserving() {
NotificationCenter.default.addObserver(
self,
selector: #selector(editPressedName(notification:)),
name: .editPressedName,
object: nil
)
}
@objc func editPressedName(notification: NSNotification) {
print("\(notification.userInfo) received")
主要VC通知Post
let activeCellName:[String: Data] = ["name":item!]
print(activeCellName)
NotificationCenter.default.post(name: .editPressedName, object: nil, userInfo: activeCellName)
当您第一次按下“编辑”按钮时,EditVC
它没有监听通知,因为它的 ViewDidLoad
函数尚未被调用并且观察者尚未设置。您可以通过向您的 startObserving
函数和第一个 ViewController 中的通知 post 添加一个制动点来检查这一点,您会看到通知首先触发,然后观察者才会在您的 EditVC
中设置。
要使其正常工作,您必须确保在触发通知之前调用 startObserving
。如果您以编程方式创建 EditVC
,则可以将 startObserving
函数移动到 init 中:
class EditVC: UITableViewController {
override init(style: UITableView.Style) {
super.init(style: style)
startObserving()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
如果你使用的是故事板,你可以这样做
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let destination = segue.destination as? EditVC {
destination.startObserving()
// And now you can post the notification
}
}
希望有人能帮助我解决我的问题。我是一个初学者程序员,这是我尝试构建的第一个认真的应用程序,所以如果我没有提供足够的信息或代码,请理解并随时指出。
我正在尝试使用通知控制器在视图控制器之间传递数据。很快这就是它的工作方式:
按下 MainVC 上的编辑按钮后,它应该传递通知并转到编辑VC,在那里应该接收数据并稍后在该视图上使用。
我遇到的问题是 EditVC 似乎在第一次加载时没有接收到数据,但如果我返回并再次按下按钮,它就可以正常工作。 有什么建议为什么它没有第一次加载吗?
我试图将观察者从 viewDidLoad 移动到 viewDidAppear 并将通知 post 移动到不同的时刻(值得一提:现在它在我长按单元格后得到 posted,长按实现的是显示要编辑或删除的其他按钮,我选择这一刻是因为我想使用该通知传递来自活动单元格的所有数据,并且也会在其他地方使用相同的通知,这个特定的 segue 在按下编辑按钮后执行)就像移动它到 editButtonPressed 功能或准备 segue 功能,但效果是一样的。我在这里错过了什么?
这是我的代码片段:
编辑VC
class EditVC: UITableViewController {
override func viewDidLoad() {
startObserving()
}
func startObserving() {
NotificationCenter.default.addObserver(
self,
selector: #selector(editPressedName(notification:)),
name: .editPressedName,
object: nil
)
}
@objc func editPressedName(notification: NSNotification) {
print("\(notification.userInfo) received")
主要VC通知Post
let activeCellName:[String: Data] = ["name":item!]
print(activeCellName)
NotificationCenter.default.post(name: .editPressedName, object: nil, userInfo: activeCellName)
当您第一次按下“编辑”按钮时,EditVC
它没有监听通知,因为它的 ViewDidLoad
函数尚未被调用并且观察者尚未设置。您可以通过向您的 startObserving
函数和第一个 ViewController 中的通知 post 添加一个制动点来检查这一点,您会看到通知首先触发,然后观察者才会在您的 EditVC
中设置。
要使其正常工作,您必须确保在触发通知之前调用 startObserving
。如果您以编程方式创建 EditVC
,则可以将 startObserving
函数移动到 init 中:
class EditVC: UITableViewController {
override init(style: UITableView.Style) {
super.init(style: style)
startObserving()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
如果你使用的是故事板,你可以这样做
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let destination = segue.destination as? EditVC {
destination.startObserving()
// And now you can post the notification
}
}