Идиома для инициализации UINavigationItem - PullRequest
4 голосов
/ 13 марта 2011

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

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

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

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

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

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

Ответы [ 2 ]

7 голосов
/ 13 марта 2011

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 объявила такой выход устаревшим по причине.Я помню, как однажды обсуждал это с коллегой, но я забыл, что это было (тогда это было очевидно).

1 голос
/ 10 мая 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.

...