2015-09-25 2 views
0

Я выполняю segue (через раскадровку) из TableViewController (встроенного в NavigationController) в другой TableViewController. I.e Выбор ячейки и представление другого TableView, на котором я хотел бы отобразить текст выбранной ячейки в качестве следующего заголовка представлений.Невозможно установить название UINavigationItem программно при начальной загрузке

Я достигаю этого, однако, не на 100% правильно. При первом первоначальном выборе ячейки заголовок navigationItem не установлен. Только после того, как я вернусь назад, а затем снова перейду через эту же ячейку, это набор названий.

Первый сниппет - мой первый viewController, который я выбираю ячейку, где я устанавливаю переменную destinationViewControllers с названием выбранной ячейки.

var valueToPass:String? 
    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
     print("You selected cell #\(indexPath.row)!") 

     // Get Cell Label 
     let indexPath = tableView.indexPathForSelectedRow!; 
     let currentCell = tableView.cellForRowAtIndexPath(indexPath) as UITableViewCell!; 

     valueToPass = currentCell.textLabel!.text 
    } 

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 

    if (segue.identifier == "tripSegue") { 

     // initialize new view controller and cast it as your view controller 
     let viewController = segue.destinationViewController as! TripTableViewController 
     // setting the view controllers property that will store the passed value 
     viewController.passedValue = valueToPass 
    } 

} 

Второй фрагмент из пункта назначенияПрименение контролера устанавливает заголовок navigationItem.

var passedValue: String? 

override func viewDidLoad() { 
    super.viewDidLoad() 

    self.navigationItem.title = passedValue 
} 
+0

Где valurEoPass получить набор в NavController –

+0

@DavidBerry Я редактировал пост, чтобы отразить свой комментарий. См. Первый фрагмент – Vince

+0

Я все еще не вижу, где вы устанавливаете значениеToPass (возможно, в didSelect ...)? –

ответ

1

Это потому, что prepareForSegue называется перед темdidSelectRowAtIndexPath. Поэтому при первом выборе строки, valueToPass - это нуль. prepareForSegue вызывается в то время как valueToPass по-прежнему равен нулю, и вы передаете его, после того как вы передадите его, didSelectRowAtIndexPath называется настройкой valueToPass на нужное значение, которое передается при следующем выборе строки.

Вам необходимо сделать все это в prepareForSegue.

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 

if (segue.identifier == "tripSegue") { 
     // Get Cell Label 
     let indexPath = self.tableView.indexPathForSelectedRow!; 
     let currentCell = self.tableView.cellForRowAtIndexPath(indexPath) as UITableViewCell!; 
     // initialize new view controller and cast it as your view controller 
     let viewController = segue.destinationViewController as! TripTableViewController 
     // setting the view controllers property that will store the passed value 
     viewController.passedValue = currentCell.textLabel!.text 

    } 
} 
+0

Большое спасибо за объяснение этого. – Vince

+0

В качестве альтернативы, сделайте это в 'didSelectRow ...' и программно вызовите segue вместо автоматического. –

+0

Что считается лучшей практикой? – Vince

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