iOS 13 Отключить модальную страницу с кнопкой - PullRequest
0 голосов
/ 23 октября 2019

Так что мне нужна помощь с отключением модального экрана листа страницы в iOS 13. Я просмотрел несколько постов, но ни один не помог.

Моды для iOS 13 - программный вызов отклонения свайпа

Глядя на 2-й ответ, я пытался это сделать, но продолжал понимать, что "я" неявно и должно быть явным. Пробовал исследовать это, но не нашел много.

Все, что я хочу сделать, это иметь кнопку Готово в правом верхнем углу панели навигации. Когда эта кнопка нажата, мне нужно подключиться к базе данных и сохранить данные, если они действительны (уже реализованы). Затем ему нужно закрыть модальный экран и обновить таблицу, чтобы получить самые новые изменения.

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

let navigationController = segue.destination as! UINavigationController
let editSensorVC = navigationController.topViewController as! EditSensorViewController

navigationController.presentationController?.delegate = editSensorVC

Он говорил, что именно так я и задал делегату, но не уверен, куда идти дальше.

Ответы [ 2 ]

1 голос
/ 24 октября 2019

Если исходный VC имеет тип PresentingVC, а модальный тип PresentedVC, я бы использовал следующий подход. Учитывая приведенное выше утверждение segue, я предполагаю, что вы используете раскадровки, но если не замените подготовку (для segue :) введением значения делегата при создании экземпляра PresentedVC

Для начинающих установите PresentedVC доудерживать делегат, определив протокол делегата и предоставив свойство делегата.


protocol PresentedVCDelegate {
   func presentedVCDidUpdateDatabase()
}

class PresentedVC {
    var delegate: PresentedVCDelegate?

    @IBAction buttontapped(_ sender: Any) {
        //existing code to validate and save data to databse
        delegate?. presentedVCDidUpdateDatabase()
        dismiss(animated: true)
    }
}

Обновите PresentingVC, чтобы он внедрялся в качестве делегата при создании экземпляра дочернего VC:

class PresentingVC {

    //all the current code

    // and amend preapre(for:) something like
    func prepare(for segue: UIStoryboardSegue, sender: Any?) {
      // Get the new view controller.
       if let presented = segue.destination as? PresentedVC {
          presented.delegate = self
          //anything else you do already
       }
    }
}

. расширить его для поддержки метода протокола

extension PresentingVC: PresentedVCDelegate {
    func presentedVCDidUpdateDatabase() {
        tableView.reloadData()
        //any other work necessary after PresentedVC exits
    }
{

Примечание: записано из памяти и не скомпилировано, поэтому может содержать незначительные опечатки, но, надеюсь, этого достаточно для прояснения концепции?

0 голосов
/ 24 октября 2019

здесь, это то, как вы делаете это target-c в представлении viewcontroller, который на самом деле ничего не представляет, но это навигационный контроллер. это простой режим.

UIViewController *pvc = [UIViewController new];
WLGNavigationController *nav = [[WLGNavigationController alloc] initWithRootViewController:pvc];
UIBarButtonItem *backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Cancel" style:UIBarButtonItemStylePlain target:self action:@selector(backerPressed)];
[[pvc navigationItem] setLeftBarButtonItem:backBarButtonItem];
[[self navigationController] presentViewController:nav animated:true completion:nil];

с нажатой подкладкой:

- (void)backerPressed {
  [[self navigationController] dismissViewControllerAnimated:true completion:nil];
}

для сложных сложных режимов:

обработчик завершения:

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

Делегирование:

написать делегата в VC, который вы представляете,когда обещание возвращается, выполните методы делегата, «отвечает селектору», бла-бла, как вы обычно делаете с делегированием. в представляемом VC вы затем делаете его делегатом представляемого вами VC, внедряете метод, который при вызове вызывает навигационный контроллер для отклонения представленного пакета navigation / viewcontroller.

...