2013-07-16 4 views
0

Я работал над настройкой пользовательского интерфейса в Xcode, который работает аналогично почтовому приложению iOS, но второй контроллер просмотра popover не будет воспроизводиться. Я пытаюсь установить название «Транзакции» навигационной панели на имя учетной записи, но вместо этого он задает заголовок для DetailViewController:Как установить заголовок NavigationItem/NavigationBar

Перед тем, как выбрать учетную запись: http://i.stack.imgur.com/zo75V.png

И после того как я выбрать «создать учетную запись»: http://i.stack.imgur.com/8DPBB.png

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    Account *account = [[self fetchedResultsController] objectAtIndexPath:indexPath]; 
    self.transactionViewController.navigationItem.title = account.name; 
} 

Я использую приведенный выше код, чтобы установить заголовок, но заголовок устанавливается для неправильного ViewController ... Этот же код не дает никакого результата вообще для версии iPhone ,

EDIT: Я на самом деле нашел ответ на этот вопрос в данном руководстве: Passing Data between View Controllers

Ключ использовать метод -prepareForSegue:sender:, чтобы получить право ViewController и установить его название. Это также позволяет передавать любые данные с одного ViewController на другой, когда вы используете переход для переключения между ними, который я теперь использую для установки учетной записи для транзакций, и чтобы получить имя учетной записи, чтобы установить ее на seque.destinationViewController.navigationItem.title.

Thank you все для вашей помощи

+0

Вы хотите установить заголовок 'Transaction' в DetailViewController? – soryngod

+0

Нет, я хочу установить заголовок, который соответствует имени учетной записи для моего TransactionViewController, а DetailViewController должен оставаться неизменным. –

+0

. В этом случае заголовок будет «Новая учетная запись» –

ответ

2

Каждый контроллер вида имеет свойство navigationItem, и каждый элемент навигации имеет свойство title. Чтобы установить заголовок, отображаемый на панели навигации для контроллера вида, вы можете просто установить navigationItem.title контроллера вида, как вы это делаете.

Я использую приведенный выше код, чтобы установить заголовок, но заголовок устанавливается для неправильного ViewController

Это звучит, как вы устанавливаете название правильно, но, возможно, установив название неправильно просмотрите контроллер. Он выглядит так: Метод -tableView:didSelectRowAtIndexPath:, который вы упомянули в своем вопросе, находится в «главном» контроллере вида, то есть в левой части экрана, а его свойство указывает на контроллер «подробный». Из вашего комментария, я полагаю, что вы создаете новый контроллер представления на «главной» стороне и нажимаете его на стек навигации, и именно этот контроллер представления должен иметь заголовок «Новая учетная запись» (или имя выбранной учетной записи). Если все правильно, тогда вы должны искать место в своем коде, где вы создаете этот новый контроллер, и установите егоnavigationItem.title в соответствующую строку.

Один важный вопрос: Какой объект пытается установить название нового контроллера? В вашем коде выше вы пытаетесь сделать это с родительского контроллера. Поскольку вы используете раскадровки, и новый контроллер представления создается с помощью segue, у вас нет простого доступа к новому контроллеру представления из вашего метода ...didSelectRowAtIndexPath.... Если вы хотите продолжить установку заголовка в родительском, вы можете реализовать -prepareForSegue:sender:, чтобы установить заголовок. С другой стороны, любой контроллер представления должен быть более или менее ответственным за то, как он себя представляет, поэтому вы можете подумать о том, чтобы контроллер дочернего представления установил свой собственный заголовок вместо того, чтобы его родитель сделал. Возможно, родитель уже использует -prepareForSegue:sender:, чтобы установить учетную запись в контроллере дочернего представления. Возможно, у ребенка есть свойство account, которое родитель звонит, чтобы установить эту информацию?Вы могли бы реализовать Присваиватель это свойство, чтобы установить название контроллера представления:

- (void)setAccount:(Account*)account 
{ 
    if (account != _account) { 
     _account = account; 
     self.navigationItem.title = account.name; 
    } 
} 
+0

«transactionViewController» является свойством в моем контроллере главного представления и имеет тип «TransactionViewController *». Как я могу убедиться, что у меня есть правильный контроллер? –

+0

Все, что вы описали, является правильным, за исключением того, что я использую раскадровку и использую segues из ячеек таблицы, чтобы нажать новый контроллер представления. Это имеет большое значение? Я установил заголовок в построителе интерфейса, но я хочу изменить его динамически во время выполнения. –

+0

@NicolaLucasBuescher Хорошо, я обновил ответ с дополнительной информацией о том, как это сделать с помощью раскадровки. – Caleb

2

Это self.navigationItem.title = account.name;. Если я хорошо вижу, что таблица находится внутри MasterViewController, а у мастера есть контроллер навигации как root.

+0

. Это не изменяет детали, но он по-прежнему не устанавливает «Сделки» на «Новая учетная запись» –

+0

. кнопка «Назад» изменяет заголовок на новую учетную запись? – soryngod

+0

да, но название учетной записи также изменяется на «Новая учетная запись». –

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