Сохранение изменений от раскрутки. Работаем совместно с <Назад - PullRequest
1 голос
/ 09 мая 2019

У меня проблемы с пониманием того, что я могу сделать с Back BarButtonItem по умолчанию и как я могу вызвать перемотку.

Ниже приведен упрощенный макет.Я вставляю ViewController в контроллер Navigation и добавляю BarButtonItem («Show») и подключаюсь ко второму VC.Это добавляет кнопку «Назад» ко второму контроллеру, как показано ниже.Basic Back Button

В первом VC я покажу пользователю некоторые детали, во втором VC будут показаны более подробные детали.С помощью кнопки «Показать» и кнопки «Назад» по умолчанию пользователь может легко перемещаться назад и вперед с ожидаемым поведением.

Моя проблема заключается в том, что пользователю будет разрешено изменить «Подробнее здесь», и мне потребуетсяпередать это первому VC после того, как пользователь откатывается назад.

Я не могу перетаскивать элементы управления с помощью значка «Назад к выходу», но я решил, что могу сделать это с помощью кнопки «Сохранить» на панели навигации, как показано,(Сначала перетащите элемент навигации наверх, затем BarButtonItem), затем перетащите элемент управления на значок «Выход».

With Save Button

С помощью кнопки «Сохранить» я могуИнициировать последовательную отмотку и записать изменения обратно в мой первый VC с помощью кода, подобного следующему:

   @IBAction func unwindFromSecondVC(_ sender: UIStoryboardSegue) {       
        if sender.source is AddCharacterViewController {
            if let senderVC = sender.source as? SecondViewController {
              details = senderVC.newDetails
            }       
        }
    }

Это создает проблему, когда пользователь вносит изменения, а затем нажимает кнопку «Назад», тем самым теряя изменения.

Мое предпочтительное решение состояло бы в том, чтобы кнопка «Назад» инициировала переход и передала изменения.Но это не представляется возможным.Мое второе решение состояло бы в том, чтобы кнопка возврата уведомляла о том, что перевод не был сделан, и прекращала процедуру отмены.По моим исследованиям, ни один из подходов не представляется возможным.

Как мне лучше всего решить эту проблему, предоставляя пользователю общую навигацию «Назад»?

1 Ответ

0 голосов
/ 09 мая 2019

Если вы хотите сохранить какие-либо изменения, сделанные пользователем во втором ВК, вы можете создать SecondVCDelegate:

protocol SecondVCDelegate : class {
    func detailsDidChange(newDetails: String)
}

В SecondVC объявите свойство delegate:

weak var delegate: SecondVCDelegate?

И всякий раз, когда детали меняются (значение текстового поля изменилось или какое-либо событие произошло), вы вызываете

delegate?.detailsDidChange(newDetails: newDetails)

В FirstVC.prepareForSegue вы должны установить self в качестве делегата SecondVC:

if let vc = segue.destination as? SecondVC {
    vc.delegate = self
}

// ...

extension FirstVC : SecondVCDelegate {
    func detailsDidChange(newDetails: String) {
        details = newDetails
    }
}

Таким образом, при каждом изменении newDetails, FirstVC будет уведомлено.

Если вы просто хотите уведомить FirstVC, когда пользователь покидает SecondVC, вы можете вместо этого вызвать делегат в SecondVC.viewWillDisappear или подобном методе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...