2017-01-27 1 views
1

У меня есть контроллер просмотра, встроенный в другой VC. Я хотел бы получить значение переменной из основного VC внутри встроенного. Как я могу это сделать?Быстро встроенный контроллер представления и родительский

Я попытался использовать «prepareForSegue», но, похоже, он не запускается для встроенных контроллеров представления.

Я пытался изолировать проблему в тестовом проекте:

enter image description here

Код для основного ВК:

class MyViewController: UIViewController { 
    @IBOutlet weak var label1: UILabel! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     label1.text = "Hello" 
    } 
} 

код для встроенного VC:

class EmbeddedVC: UIViewController { 
    @IBOutlet weak var label2: UILabel! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     //label2.text = how to get value of label1 ? 
    } 
} 

Спасибо за ваша помощь :)

+1

Это не встроенная система. Прочитайте описания тегов, прежде чем добавлять их в свой вопрос. – Lundin

ответ

3

Путь к достижению этого - получить экземпляр контроллера child view в представлении родителяDidLoad. По-видимому, родительский viewDidLoad: вызывается после представления childDidLoad :, что означает, что метка уже создана в представлении дочернего элемента.

override func viewDidLoad() { 
     super.viewDidLoad() 

     if let childVC = self.childViewControllers.first as? ChildVC { 
      childVC.someLabel.text = "I'm here. Aye-aye." 
     } 

    } 
+0

Решение Cruz работает, но этот кажется более прочным, спасибо;) – Eric

2

Вы должны попытаться использовать prepareForSegue как это:

if segue.identifier == "identifier" { 
     guard let destinationViewController = segue.destination as? VC2 else { return } 

     destinationViewController.label2.text = mytext 
    } 

Где идентификатор Segue присвоенным в раскадровке

4

Прежде всего вы не можете установить непосредственно lable2.text EmbeddedVC в В prepareForSegue

потому что последовательность вызовов, следующая ниже:

  1. prepareForSeque MainVC на этот раз EmbeddedVC's label2 i s ноль
  2. EmbeddedVC в viewDidLoad тогда называли label2 нагруженный
  3. MainVC-х viewDidLoad называли тогда label1 нагруженный

так что если вы назначаете MainVC's label1.text к EmbeddedVC's label2.text в prepareForSeque как label1 и LABEL2 равны нулю, так не работает

Есть два способа решить этот вопрос

Первое решение MainViewController имеет EmbeddedVC и когда MainVC-х viewDidLoad называется, назначить Label1.Text к embeddedVC.label2.text

class MyViewController: UIViewController { 
    @IBOutlet weak var label1: UILabel! 
    var embeddedVC: EmbeddedViewController? = nil 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     label1.text = "Hello" 
     embeddedVC?.label2.text = label1.text 
    } 

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     if let embeddedVC = segue.destination as? EmbeddedViewController { 
      self.embeddedVC = embeddedVC 
     } 
    } 
} 

class EmbeddedViewController: UIViewController { 
    @IBOutlet weak var label2: UILabel! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 
} 

Второе решение, протокол использования и получить текст метки MainVC, когда viewWillAppear или viewDidAppear (позже viewDidLoad называется)

protocol EmbeddedVCDelegate: class { 
    func labelText() -> String? 
} 

class MyViewController: UIViewController, EmbeddedVCDelegate { 
    @IBOutlet weak var label1: UILabel! 

    // MARK: EmbeddedVCDelegate 
    func labelText() -> String? { 
     return label1.text 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     label1.text = "Hello" 
    } 

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     if let embeddedVC = segue.destination as? EmbeddedViewController { 
      embeddedVC.delegate = self 
     } 
    } 
} 

class EmbeddedViewController: UIViewController { 
    @IBOutlet weak var label2: UILabel! 
    weak var delegate: EmbeddedVCDelegate? = nil 
    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 

    override viewWillAppear(_ animated: Bool) { 
     super.viewWillAppear(animated) 
     label2.text = delegate?.labelText() 
    } 
} 
Смежные вопросы