Как мне установить заголовок 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.

Другие вопросы по тегам