Подтвердить что ты не робот

Как отправить значения родительскому контроллеру представления в Swift

Я работаю над экраном контроллера настроек для моего приложения iOS, написанного быстро. Я использую контроллер навигации, чтобы запустить представление таблицы основных настроек, которое показывает ячейку под названием "Метод ввода". Текущий метод указан справа от ячейки. Они могут щелкнуть ячейку, чтобы перейти к следующему контроллеру представления, где они могут выбрать способ ввода, который они хотели бы.

Отсюда два раздела. Первый - это метод ввода (сенсорный экран или джойстик). Второй раздел - это джойстик, который зависит от того, является ли человек левым или правым. Я не хочу, чтобы vc раскручивался, когда они выбирают один ящик, потому что они могут выбрать один и в другом разделе.

Мой вопрос: как обновить текстовое поле в родительском контроллере от дочернего контроллера.

Проблемы, которые у меня возникают для дополнительных решений:

let parentVC: UIViewController = (self.navigationController?.parentViewController)!
parentVC.inputMethod.text? = cellSelected // This doesn't work because it cannot find the label inputMethod.

viewDidLoad() вызовет задержку, и пользователь увидит старый метод до его изменения.

Я не могу узнать, как запустить сеанс, когда кто-то нажимает кнопку "Назад" в верхней левой части навигационного контроллера, поскольку контроллер навигации контролирует сегмент.

4b9b3361

Ответ 1

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

В дочернем контроллере добавьте протокол, например:

protocol ChildNameDelegate {
    func dataChanged(str: String)
}

class ChildClass {

    weak var delegate: ChildNameDelegate?

    func whereTheChangesAreMade(data: String) {
        delegate?.dataChanged(data)
    }
}

И в родительском:

class ParentClass: ChildNameDelegate {

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        guard let segueId = segue.identifier else { return }

        switch segueId {
        case "childSegue":
            let destVC = segue.destinationViewController as! ChildClass
            destVC.delegate = self
            break
        default:
            break
        }
    }

    // Child Delegate
    func dataChanged(str: String) {
        // Do whatever you need with the data
    }
}

Ответ 2

Вам нужно указать parentViewController на любой пользовательский класс, который у него есть. Например, если родительский класс имеет класс ExampleParentController, вы должны написать:

let parentVC = (self.navigationController?.parentViewController)! as! ExampleParentController
parentVC.inputMethod.text? = cellSelected

Ответ 3

Я нашел решение здесь: Модификация одной переменной из другого контроллера просмотра swift http://www.raywenderlich.com/115300/swift-2-tutorial-part-3-tuples-protocols-delegates-and-table-views

Вместо того, чтобы пытаться напрямую обращаться к контроллеру представления (что было бы проще, если бы он не возвращал нуль для контроллера представления), вы можете использовать метод делегата для настройки переменных. Делегат работал как шарм!