NotificationCenter не передает данные при первой загрузке нового представления, но делает это каждый раз - PullRequest
0 голосов
/ 01 апреля 2020

надеюсь, кто-нибудь может помочь мне с моей проблемой. Я начинающий программист, и это мое первое серьезное приложение, которое я пытаюсь создать, поэтому, пожалуйста, поймите и не стесняйтесь указывать, если я не предоставил достаточно информации или кода.

Я пытаюсь передавать данные с помощью контроллера уведомлений между контроллерами представления. Коротко, вот как это должно работать:

После нажатия кнопки редактирования на MainV C он должен передать уведомление и go на EditV C, где эти данные должны быть получены и использованы позже. Посмотреть.

Проблема, с которой я столкнулся, заключается в том, что, кажется, EditV C не получает данные при первой загрузке, но если я go вернусь и снова нажму кнопку, это будет работать безупречно. Любое предложение, почему он не загружается в первый раз?

Я пытался переместить наблюдателя из viewDidLoad в viewDidAppear и сообщение уведомления в другой момент (стоит упомянуть: сейчас он публикуется после того, как я долго жму ячейку, что при долгом нажатии показывает дополнительные кнопки для редактирования или удаления, я выбрал этот момент, потому что я хочу использовать это уведомление для передачи всех данных из активной ячейки и использовать то же уведомление в других местах, этот конкретный c segue выполняется после нажатия кнопки редактирования), например, перемещение его в функцию editButtonPressed или подготовка для функции segue, но эффект тот же. Что мне здесь не хватает?

Вот фрагменты моего кода:

Редактировать V C

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")

MainV C Уведомление

let activeCellName:[String: Data] = ["name":item!]
print(activeCellName)
NotificationCenter.default.post(name: .editPressedName, object: nil, userInfo: activeCellName)

1 Ответ

0 голосов
/ 01 апреля 2020

Когда вы нажимаете кнопку «Редактировать» в первый раз, EditVC не прослушивает уведомление, так как его функция ViewDidLoad еще не была вызвана, а наблюдатель еще не настроен. Вы можете проверить это, добавив точку торможения к вашей функции startObserving и к сообщению с уведомлением в вашем первом ViewController, и вы увидите, что уведомление срабатывает первым, и только тогда наблюдатель устанавливается в вашем 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")
    }
}

Если вы используете storyBoard, вы можете сделать что-то вроде этого

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let destination = segue.destination as? EditVC {
        destination.startObserving()
        // And now you can post the notification
    }
} 
...