Идиома для инициализации UINavigationItem

Поскольку выходы UIViewController navigationItem устарели (да, я немного отстал), какова правильная идиома, определяющая элементы UINavigationItem?

Я видел несколько предложенных подходов, но ни один из них не совсем ясен для меня:

  1. «Встроить элемент навигации в контроллер представления» в XIB контроллера представления.

  2. Инициализируйте свойства элемента навигации в коде, используя значения с нуля.

  3. Создайте выход для контроллера навигации в контроллере представления, подключите элемент навигации в XIB контроллера представления и используйте его свойства для инициализации (фактических) свойств элемента навигации в коде.

Мне непонятно, как «встроить» элемент навигации (просто добавление его в качестве дочернего элемента контроллера представления в IB не дает никакого эффекта); и мне непонятно, какой из этих подходов лучше, или, если на то пошло, где (в каком методе) делать 2 или 3.


person orome    schedule 13.03.2011    source источник


Ответы (2)


1) Если контроллер создан в XIB, вы можете перекинуть на него UINavigationItem и настроить этот пункт - он будет работать. Например, когда вы определяете UINavigationControler в XIB, вы можете поместить внутрь некоторый контроллер в качестве контроллера корневого представления. Таким образом, вы можете иметь UINavigationItem для этого контроллера в XIB.

2) Если контроллер загружает свой вид из XIB (он был создан alloc, а затем init или initWithNibName:bundle:), он представлен в XIB только как File's Owner, который не поддерживает в нем UINavigationItem. В этом случае вы должны настроить элемент навигации в коде (обычно я делаю это в viewDidLoad). Его не нужно создавать, он уже есть в свойстве navigtionItem вашего контроллера.

self.navigationItem.title = @"Price List";

Возможно, можно сделать выход для элемента навигации, но я бы не рекомендовал этого делать. Apple не просто так объявила такую ​​розетку устаревшей. Я помню, как однажды обсуждал это с коллегой, но я забыл, что это было (тогда это было очевидно).

person hoha    schedule 13.03.2011
comment
Итак, если я правильно понимаю 1: если контроллер, к которому я хочу подключить UINavigationItem, является дочерним элементом другого объекта в XIB (например, UINavigationController), то я могу встроить UINavigationItem в качестве дочернего элемента, и он будет работать. Однако если контролер является владельцем XIB, нет возможности прикрепить UINavigationItem к XIB. Если это так, то это странно, так как это означает, что хотя вы потенциально можете использовать IB для указания UINavigationItem для начального представления в навигационном контроллере, все остальное должно быть указано в коде. - person orome; 14.03.2011

В нашем проекте у нас есть требование сделать пользовательский интерфейс максимально настраиваемым из IB. Итак, я добавляю UINavigationItem в xib, настраиваю его, связываю его как выход с моим пользовательским подклассом UIViewController, а затем копирую все свойства во время выполнения с помощью метода, добавленного в UIViewController, используя категорию:

- (void)setNavigationItemPropertiesFromOtherItem:(UINavigationItem *)navItem 
{
    // WORKAROUND: we can't link UINavigationItem to UIViewController from IB, and navigationItem property in UIViewController is readonly
    self.navigationItem.title = navItem.title;
    self.navigationItem.prompt = navItem.prompt;
    self.navigationItem.hidesBackButton = navItem.hidesBackButton;
    if (navItem.backBarButtonItem != nil) 
    {
        self.navigationItem.backBarButtonItem = navItem.backBarButtonItem;
    }
    if (navItem.leftBarButtonItem != nil)
    {
        self.navigationItem.leftBarButtonItem = navItem.leftBarButtonItem;
    }
    if (navItem.rightBarButtonItem != nil)
    {
        self.navigationItem.rightBarButtonItem = navItem.rightBarButtonItem;
    }
    if (navItem.titleView != nil)
    {
        self.navigationItem.titleView = navItem.titleView;
    }
}

Этот обходной путь также позволяет связать элементы кнопок панели с UINavigationItem с помощью IB.

person zubko    schedule 10.05.2011
comment
Спасибо! У меня было такое же требование, и я принял ваш метод. Оно работает. - person ravinsp; 17.06.2011