2017-02-18 4 views
1

Я изо всех сил пытаюсь передать выбранный параметр в представлении выбора в одном контроллере представления в текст метки метки в другом контроллере представления. VC с меткой, которую я хочу обновить, имеет идентификатор раскадровки: «PageContentViewController». VC с моим подборщика (periodPicker) имеет кнопку «Выбрать» в нижней части представления, которая вызывает следующую функцию при нажатии:Обновить текст ярлыка в другом контроллере представления

@IBAction func selectButtonPressed(_ sender: Any) { 

    let row = periodPicker.selectedRow(inComponent: 0) 
    let selected = periodType[row] 

    let pageContentViewController = self.storyboard?.instantiateViewController(withIdentifier: "PageContentViewController") as! PageContentViewController 

    pageContentViewController.periodLabelTitle = selected 

} 

код PageContentViewController класса

import UIKit 

class PageContentViewController: UIViewController {  

    @IBOutlet weak var periodLabel: UILabel! 

    @IBOutlet weak var dateLabel: UILabel! 

    var pageIndex: Int = 0 
    var periodLabelTitle: String! 
    var dateLabelTitle: String! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     periodLabel.text = periodLabelTitle 
     dateLabel.text = dateLabelTitle 

    } 

} 

Когда переходя к PageContentViewController с помощью кнопок вкладок (это приложение на основе табуляции), текст ярлыка не обновляется. Где я иду не так?

Я попытался использовать команду periodLabel.text = periodLabelTitle в методе viewDidAppear для pageContentViewController, но это все еще не сработало (после нажатия кнопки «Выбрать» ранее).

Я считаю также уместным упомянуть, что PageContentViewController является ребенком VC UIPageViewController.

+0

Возможный дубликат [Передача данных между контроллерами просмотров] (http://stackoverflow.com/questions/5210535/passing -data-between-view-controller) – KK7

+0

Попробуйте положить точку прерывания в метод 'viewDidLoad()' и проверить, пустой ли текст или нет. – KrishnaCA

+0

@ KK7 Это не применяется. OP ссылается на приложение табуляции, которое не использует segues. – Shades

ответ

0

В selectButtonPressed(_:) вы создаете новый экземпляр PageContentViewController:

// Creates a new instance of PageContentViewController and assigns it to pageContentViewController 
let pageContentViewController = self.storyboard?.instantiateViewController(withIdentifier: "PageContentViewController") as! PageContentViewController 

Чтобы обновить метку в ViewController, который виден в панели вкладок, ваши должны использовать этот экземпляр, а не новый. Вот пример того, как сделать это:

tabBarController?.viewControllers[0].periodLabelTitle = selected 

Обратите внимание, что я использую индекс 0 в моем примере. Возможно, вам придется изменить индекс, если ваш PageContentViewController не является первым элементом в вашей панели вкладок.

Также обратите внимание, что хотя этот вопрос отвечает на ваш вопрос, это, вероятно, не лучший способ реализовать что-то подобное, потому что это решение зависит от порядка просмотра контроллеров. Я предлагаю использовать либо

  • Делегирование образец между viewcontrollers или
  • NSNotificationCenter
  • Key-Value-наблюдения
+0

Спасибо. Я отредактировал сообщение, поскольку забыл упомянуть, что целевой VC, где обновление текстовой метки является дочерним элементом 'UIPageViewController'. Должен ли этот подход по-прежнему работать? –

+0

Я попытался поместить ваш предложенный код в метод 'selectButtonPressed', но я получаю ошибку 'Значение типа UIViewController не имеет члена' periodLabelTitle ' –

0

кажется, что вы не представляя PageContentViewController от func selectButtonPressed(_ sender: Any). Это означает, что когда вы представляете PageContentViewController, это экземпляр, где вы не установили periodLabelTitle

Смежные вопросы