2017-01-21 10 views
0

До настоящего времени Xcode/Swift/iOS.Невозможно обновить встроенный дочерний VC от не-родителя VC

У меня есть Master VC (называемый StartVC), который содержит дочерний VC (называемый TopBarVC) через и встроенный segue. Child VC содержит кнопку, которая при нажатии, модально переходит к третьему VC (называемому CategoryPickerOverlayVC) (вид в этом VC служит в качестве раскрывающегося списка для выбора категории).

@IBAction func CategoryFilterButtonPressed(_ sender: Any) { 

    performSegue(withIdentifier: "toCategoryPickerOverlay", sender: self) 

} 

При выборе опции из выпадающего списка, который сам по себе состоит из трех кнопок, название выбранной кнопки должны быть использованы для замены текста заголовка кнопки в ребенка ВК.

В Master VC я использую prepareforsegue для хранения ссылки на Child VC в переменной - «topBarReference» - в момент, когда происходит встраивание segue.

var topBarReference: TopBarVC? 


    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {   
    if segue.identifier == "TopBarPane"{ 
     topBarReference = segue.destination as? TopBarVC 
    } 
} 

Затем, в 3-й ВК, когда я нажимаю на одном из вариантов кнопки в раскрывающемся списке, название кнопки отправляется через prepareforsegue обновить кнопку в детской VC (через «topBarReference») ,

 if segue.identifier == "unwindToStartVC"{ 

     let vc = segue.destination as! StartVC 

     vc.topBarReference?.filterButtonText = ((sender as! UIButton).titleLabel?.text)! 

    } 

3-й VC затем разматывается назад к главному VC. Я должен добавить, что когда кнопка в Child VC изменена, переменная (filterButtonText) в Child VC сначала устанавливается с текстом заголовка, а затем эта переменная используется для установки текста заголовка кнопки с помощью метода viewDidAppear Child VC.

При использовании отладчика я также отмечаю, что viewDidAppear в Master VC, похоже, не выполняется после разматывания (я установил диагностическую команду print-to-console в viewDidAppear и после распечатки ничего не печатает). Я понимаю, что это объясняет, что кнопка не обновляется, но я понятия не имею, почему viewDidAppear не запускается.

Я также пробовал использовать делегатский протокол и instantiateViewController (withString :) безрезультатно. Все методы дают тот же результат, что и кнопка в Child VC не обновляется. Ошибок нет. Все остальное происходит так, как ожидалось.

Любые идеи относительно того, что я делаю неправильно?

+0

если они оба встроены в StartVC, то есть StartVC все еще отображается, а затем просмотр отображался не будет вызван. Попробуйте использовать оповещения. Сделайте свой startVC для прослушивания определенного уведомления и отправьте его, когда вы разматываете/выбираете опцию из раскрывающегося списка. Внутри вашего кода обработчика уведомлений обновите заголовок кнопки –

+0

Третий VC - отдельный VC, а не встроенный. – Rossco

+0

«Я понятия не имею, почему viewDidAppear не запускается». Потому что он никогда не исчезал. Я думаю, что это и сказал @ShawnFrank. – matt

ответ

0

Итак, я обнаружил, что мой исходный код работает отлично бар на одну строку в prepareforsegue ребенок ОК.Если изменить эту prepareforsegue от:

 if segue.identifier == "unwindToStartVC"{ 

     let vc = segue.destination as! StartVC 
     vc.topBarReference?.CategoryFilterButton.titleLabel?.text = ((sender as! UIButton).titleLabel?.text)! 

    } 

к этому:

 if segue.identifier == "unwindToStartVC"{ 

     let vc = segue.destination as! StartVC 
     vc.topBarReference?.CategoryFilterButton.setTitle((sender as! UIButton).titleLabel?.text, for: .normal) 

    } 

это работает просто отлично. Использование метода .setTitle, похоже, имеет значение, хотя я не уверен, почему.

Благодаря Мэтту за то, что он дал мне идею изменить его на это. Метод Мэтта действительно работал, когда я его пробовал, хотя, поскольку я отмахиваюсь от Master VC, а не от Child VC, мне пришлось соответствующим образом отредактировать код с точки зрения того, где я его разместил.

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

Спасибо всем, что нашли время ответить!

0

Вы имеете в виду что-то вроде этого?

enter image description here

Если да, то решение, которое я использовал, был очень прост: третий VC использует prepareForSegue, чтобы задать свойство встроенного VC, а встроенный VC поднимает, что свойство в методе unwind.

В моей реализации три контроллера вида называются ViewController, ChildViewController и ThirdViewController. Это всего код (все остальное настраиваются в раскадровке):

class ChildViewController: UIViewController { 

    @IBOutlet weak var theButton: UIButton! 
    var buttonTitle : String? 

    @IBAction func unwind(_:UIStoryboardSegue) { 
     self.theButton.setTitle(self.buttonTitle, for: .normal) 
    } 

} 
class ThirdViewController: UIViewController { 

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     (segue.destination as! ChildViewController).buttonTitle = (sender as! UIButton).currentTitle 
    } 

}