Как мне установить заголовок NavigationItem/NavigationBar
Я работал над настройкой пользовательского интерфейса в Xcode, который работает аналогично почтовому приложению iOS, но второй контроллер представления popover не подойдет. Я пытаюсь установить заголовок панели навигации "Транзакции" на имя учетной записи, но вместо этого он устанавливает заголовок для DetailViewController:
Прежде чем выбрать аккаунт:
И после того, как я выберу "Новый аккаунт":
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
Account *account = [[self fetchedResultsController] objectAtIndexPath:indexPath];
self.transactionViewController.navigationItem.title = account.name;
}
Я использую приведенный выше код для установки заголовка, но заголовок установлен для неправильного viewController... Этот же код вообще не дает результата для версии для iPhone.
РЕДАКТИРОВАТЬ: Я действительно нашел ответ на это в этом руководстве: Передача данных между контроллерами представления
Ключ должен использовать -prepareForSegue:sender:
метод, чтобы получить правильный viewController и установить его название. Это также позволяет вам передавать любые данные от одного ViewController к другому всякий раз, когда вы используете переход для переключения между ними, который я сейчас использую, чтобы установить учетную запись для транзакций и получить имя учетной записи для установки на seque.destinationViewController.navigationItem.title
имущество
Спасибо всем за вашу помощь
2 ответа
Каждый контроллер представления имеет navigationItem
свойство, и каждый элемент навигации имеет title
имущество. Чтобы установить заголовок, отображаемый на панели навигации для контроллера представления, вы можете просто установить контроллер представления navigationItem.title
так же, как вы делаете.
Я использую приведенный выше код для установки заголовка, но заголовок установлен для неправильного viewController
Звучит так, будто вы устанавливаете заголовок правильно, но, возможно, устанавливаете заголовок не того контроллера представления. Похоже, -tableView:didSelectRowAtIndexPath:
метод, который вы упомянули в своем вопросе, находится в "главном" контроллере представления, то есть в левой части экрана, и что его transactionViewController
свойство указывает на "детализированный" вид контроллера. Из вашего комментария я понимаю, что вы создаете новый контроллер представления со стороны "master" и помещаете его в стек навигации, и именно этот контроллер представления должен иметь название "Новая учетная запись" (или иначе имя какой бы учетной записи ни было выбрано). Если это все правильно, то вы должны найти место в вашем коде, где вы создаете этот новый контроллер и установить его navigationItem.title
в соответствующую строку.
Один важный вопрос: какой объект пытается установить заголовок нового контроллера представления? В приведенном выше коде вы пытаетесь сделать это из родительского контроллера. Поскольку вы используете раскадровки, а новый контроллер представления создается с помощью segue, у вас нет легкого доступа к новому контроллеру представления из вашего ...didSelectRowAtIndexPath...
метод. Если вы хотите продолжить устанавливать заголовок в родительском, вы могли бы реализовать -prepareForSegue:sender:
установить заголовок. С другой стороны, любой контроллер представления должен более или менее отвечать за то, как он себя представляет, поэтому вы можете рассмотреть вопрос о том, чтобы дочерний контроллер представления установил свой собственный заголовок, а не родительский. Родитель, вероятно, использует -prepareForSegue:sender:
уже настроить учетную запись в контроллере дочернего представления. Может быть, у ребенка есть account
свойство, которое родитель вызывает для установки этой информации? Вы можете реализовать установщик для этого свойства, чтобы установить заголовок контроллера представления:
- (void)setAccount:(Account*)account
{
if (account != _account) {
_account = account;
self.navigationItem.title = account.name;
}
}
Это self.navigationItem.title = account.name;
, Если я хорошо вижу, стол находится внутри MasterViewController
и мастер имеет контроллер навигации в качестве root.