2017-02-03 7 views
0

Есть 2 режима просмотраКонтроллер: navigationController-> root-> A enter image description here В viewController A, если пользователь делает некоторые настройки и нажимает элемент кнопки на левой панели (Назад), я хочу, чтобы корневой вид возобновил компоновку (размер некоторых просмотров будет изменен).Как перезагрузить rootViewController в navigationController При нажатии «назад»?

К настоящему моменту я заставляю его работать, добавив еще один навигационный контроллер между двумя viewControllers (присутствует модально): navigationController-> root-> navigationController-> A. enter image description here

Есть ли способ, чтобы обновить корневой ViewController одним navigationController? (Скриншот 1)

Спасибо.

----- ----- Отредактированные

Примеры кодов:

override func viewWillAppear(_ animated: Bool) { 

    creatButtons() 

} 

func createButtons(){ 

    let button1 = UIButton() 
    ........ 
    let button2 = UIButton() 
    ........ 
    ....... 

} 

Если я создаю 16 кнопок под viewWillAppear(), будет все кнопки дублируются, когда возвращается из A ? Их размер должен быть обновлен.

+0

Пожалуйста, вы можете поделиться вы код, что вы на самом деле хотите –

+0

Что вы имеете в виду ** "обновить корневой ViewController с одним навигационным контроллером "**? –

+0

@NiravD Я загрузил 2 скриншота, это может быть яснее. – jdleung

ответ

2

Не уверен, что, если я понял ваш вопрос правильно, но вот две альтернативы о том, как справиться с таким сценарием:

Если вы хотите, чтобы обновить просмотр иерархию root при изменении настроек в A просто убедитесь, что сохраняться изменения в месте, доступ к которому могут получить как root, так и A. Переопределите -viewWillAppear: (также будет активирован «назад») в root и разметьте представление в соответствии с настройками каждый раз.

Другая альтернатива:

Вы можете создать delegate protocol для A, реализуемый root и назначить root в A «s delegate когда root конкретизирует или представляет A.

AA затем обращается к своему делегату (root), чтобы сообщить об этом изменениям и сообщить root свои взгляды.

+0

Это хорошая идея сделать это в viewWillAppear, но вы имели в виду обновление размера или перерисовку всего макета? Если перерисовать весь макет, будет ли дублировать макет? Если только обновить размер, это будет очень много работы, так как у него есть 16 кнопок, которые нужно изменить. – jdleung

+0

Я бы рекомендовал создавать все кнопки при создании контроллера вида в '-viewDidLoad' и устанавливать их размер и внешний вид из' -viewWillAppear: '. Таким образом, вы всегда можете обновить рамку и внешний вид кнопок, прежде чем каждый раз отображать контроллер вида. –

0

RootViewController

class RootViewController: UIViewController ,ProtocolDemo{ 

    @IBOutlet weak var IBbtnHeight: NSLayoutConstraint! 
    @IBOutlet weak var IBbtnWidth: NSLayoutConstraint! 

    @IBAction func btnNextTapped(sender: AnyObject) { 

     let sec = SecondVC(nibName: "SecondVC", bundle: nil) 
     sec.delegate = self 
     self.navigationController?.pushViewController(sec, animated: true) 
    } 

    //Mark:- ProtocolDemo Delegate Method 
    func displayMethod(width : Int , height : Int) 
    { 
     self.IBbtnHeight.constant = CGFloat(height) 
     self.IBbtnWidth.constant = CGFloat(width) 
     print("Protocol Calling here") 
    } 
} 

SecondVC - Вы можете прочитать, как вид контроллера

protocol ProtocolDemo 
{ 
    func displayMethod(width : Int , height : Int)//PassYouWantToChange 
    //Here you can send full frame if change to update 
} 

class SecondVC: UIViewController { 

var delegate : ProtocolDemo? 

    @IBAction func btnBackTapped(sender: AnyObject) { 

     delegate?.displayMethod(160, height: 160) //Calling Delegate method 
     //pass your data you want to implement 
     self.navigationController?.popViewControllerAnimated(true) 
    } 
} 
+0

Я отредактировал свой вопрос и добавил два скриншота, и просто интересно, будет ли макет создаваться дважды? – jdleung

+0

@jdleung, см. Также я также обновляю свой ответ. Вам необходимо установить ограничение IBOutlet и вернуться к контроллеру, чтобы обновить их. –

+0

Спасибо за ваше предложение! Я не сомневаюсь, что он может работать через протокол. Но вы знаете, что у представления есть 16 кнопок, мне нужно написать больше кодов. Перезагрузка всего представления - лучший способ, теперь я думаю, что лучший выбор на втором скриншоте. – jdleung