Контролер панелі вкладок всередині навігаційного контролера або спільний перегляд кореневого перегляду навігації


80

Я намагаюся реалізувати інтерфейс користувача, структурований, як у додатку Tweetie , який поводиться так: контролер подання верхнього рівня, схоже, є контролером навігації, кореневим видом якого є подання таблиці "Облікові записи". Якщо натиснути будь-який рахунок, він переходить на другий рівень, який має панель вкладок внизу. Кожен елемент вкладки показує інший список і дозволяє детальніше деталізувати (наступні рівні не відображають панель вкладок).

Отже, здається, що ієрархія реалізації така:

  • UINavigationController
    1. Рахунки :UITableViewController
    2. UITabBarController
      1. Твіти :UITableViewController
        • Детальний вигляд твіту / користувача / тощо
      2. Відповіді :UITableViewController
      3. ...

Здається, це працює [^ 1], але, схоже, не підтримується згідно з документацією SDK для -pushViewController:animated:(курсив додано):

viewController : контролер перегляду, який висувається на стек. Він не може бути екземпляром контролера панелі вкладок.

Я хотів би уникати приватних API та подібних, але я не впевнений, чому це використання явно заборонено, навіть коли воно, здається, працює нормально. Хтось знає причину?

Я думав про те, щоб поставити контролер панелі вкладок як основний контролер, кожна з яких має окремі контролери навігації. Проблема в тому, що кожен навігаційний контролер повинен спільно використовувати один кореневий контролер подання (а саме таблицю "Облікові записи" в Tweetie ) - це, здається, не спрацьовує: натискання контролера таблиці на другий контролер навігації видаляє його з першого. Не кажучи вже про все ведення бухгалтерії при виборі іншого рахунку, мабуть, було б болем.

Як мені реалізувати це правильним шляхом?

[^ 1]: Контролер панелі вкладок потрібно підкласифікувати, щоб елемент навігації контролера панелі вкладок на цьому рівні залишався синхронізованим з вибраним елементом навігації вибраної вкладки, а контролер таблиці окремої вкладки повинен пересувати свої відповідні подання деталей self.tabBarController.navigationControllerзамість self.navigationController.

Відповіді:


63

Дві попередні відповіді зрозуміли правильно - я не використовую UITabBarControllerв Tweetie. Досить просто написати власний XXTabBarController(звичайний підклас UIViewController), який із задоволенням потрапить у стек навігаційного контролера, але все ще живе згідно з філософією "перегляду контролера". Кожна "вкладка" у перегляді облікового запису ( Tweets/ Replies/ Messages) є своїм власним контролером перегляду, і, що стосується них, їх на екрані міняє простота UITabBarController.


2
Як ваш власний клас контролера панелі вкладок обробляє сантехніку для властивостей navigationItem і navigationController своїх дочірніх контролерів?
bvanderveen

Чи змінилося це в iOS 5? Здається, я можу додати UITabBarController до UINavigationController без зайвих проблем, навіть як кореневий контролер.
sparkFinder

33

Я будую додаток, який використовує схожу структуру навігації, як Tweetie. Я написав допис про те, як це зробити, у своєму блозі www.wiredbob.com, який також посилається на вихідний код. Це повний шаблон, який ви можете взяти і використати як основу для іншого проекту. Удачі!


10
Для тих, хто цікавиться, посилання на згаданий допис у блозі wiredbob.com/blog/2009/4/20/…
Anh,

@ Роберт Конн, дуже гарний підручник. Я використовую вашу концепцію, але з певних причин моя вкладка tabBar не активна. Це траплялося з вами, коли ви впроваджували свій додаток?
A Salcedo

@ASalcedo: У мене теж була ця проблема, але я виявив, що це тому, що мені потрібно було зменшити розмір подань, пов'язаних з елементами панелі вкладок, розмір висоти за замовчуванням 460 був великим, у вихідному коді на www.wiredbob.com Ви побачите, що для елементів вкладок встановлена ​​висота 369, щоб дозволити панель вкладок. Для того, щоб змінити висоту в конструкторі інтерфейсів, вам також слід переконатися, що в інспекторі атрибутів подання для статусу, верхньої та нижньої панелі не встановлено значення (не відразу очевидно).
Ізак

2
Повідомлення в блозі для мене мертве, чи є у когось таке шахрайство?
Тіаго Велосо

посилання на робочий допис у блозі: wiredbob.com/2009/04/iphone-tweetie-style-navigation.html
oluckyman,

10

Можна додати UITabBar до будь-якого UIViewController. Таким чином, вам насправді не потрібно натискати на UITabBarController і, отже, дотримуватися вказівок API Apple.

У конструкторі інтерфейсів UITabBar знаходиться в розділі "Windows, Views & Bars" у бібліотеці Cocoa Touch.


1
Привіт! @Himadri Choudhury, чи можете ви пояснити "і, отже, дотримуватися вказівок Apple API" - або дати посилання? Я не можу знайти, де сказано про цю інструкцію (я не сумніваюся, що вона існує, але я не можу знайти URL-адресу). Щиро дякую
darksider

10

Я роблю це в кількох своїх програмах. Фокус у додаванні панелі вкладок у додаток на основі NaviController полягає в тому, щоб НЕ використовувати TabBarController. Додайте панель вкладок до подання, зробіть контролер перегляду для цього подання TabBarDelegate і відповідайте на вибір користувача на панелі вкладок у коді контролера перегляду.

Я використовую панелі вкладок, щоб додати додаткові подання до подання панелі вкладок як під-перегляди, перезавантажити подання таблиці різними наборами даних, перезавантажити UIPickerView тощо


6

Я намагався впродовж останньої години реалізувати, UITabBarоскільки він сховався б, коли я намагався відобразити свій погляд; тоді я знайшов цей пост :

По суті, переконайтеся, що ви вставляєте свій новий вигляд під панель вкладок, відповідно до цього рядка коду:

[self.view insertSubview:tab2ViewController.view belowSubview:myTabBar];

Дякую, це допомогло виправити мій зниклий рядок вкладок. Я використав той самий код, який запропонував Роберт Конн, але якимось чином панель вкладок ui зникає, коли я перемикаюся на другий вигляд.
Віджай Катам

3

У моєму додатку контролер кореневого перегляду - це контролер UINavigation. У певний момент у програмі мені потрібно відобразити UITabBar. Я спробував реалізувати UITabBar на UIView в межах ієрархії навігації, як пропонували деякі попередні публікації, і це працює. Але я виявив, що хочу більше поведінки за замовчуванням, яку надає контролер табуляції, і знайшов спосіб використовувати UITabBarController з контролером UINavigation:

1) Коли я хочу відобразити подання UITabBarController, я роблю це:

MyAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
appDelegate.window.rootViewController = myUiTabBarControllerInstance;

2) Коли я хочу повернутися туди, де я був у ієрархії навігації, я роблю це:

appDelegate.window.rootViewController = myNavControllerInstance;

3

Цього можна досягти, просто вбудувавши TabBarController в Навігаційний контролер. У розкадруванні:

  1. Перетягніть ViewController
  2. Клацніть на Сцену ViewController
  3. Клацніть на редактор >> Вбудувати в >> Контролер навігації.
  4. Перетягніть кнопку на тому ж ViewController.
  5. Перетягніть TabBarController
  6. Підключіть кнопку ViewController до TabBarController за допомогою натискання Segue Action.

У цьому випадку лише стек RootViewController TabBarController буде знаходитися в стеку контролера навігації. Усі TabBarItems матимуть панель навігації вгорі, і користувач може перейти на головний екран у будь-який час, незалежно від вибраного TabBarItem

Це можна зробити в будь-якому ViewController у стеку контролера навігації.

Якщо це працює, будь ласка, підкажіть мені, як підвищити репутацію, щоб я міг розміщувати зображення та код у наступній відповіді. :)


3

Ось як я це зробив. Це насправді штовхає контролер панелі вкладок на навігаційний контролер. Це чудово працює. Я ніде в документації не знайшов, що apple не підтримує цей спосіб. Хтось може дати мені посилання на це попередження?

Якщо це правда, чи можливо Apple відмовляється публікувати мій додаток у магазині?

-(void)setArrayAndPushNextController
{
    MyFirstViewController *myFirstViewController = [[MyFirstViewController alloc] init];
    MySecondViewController *mySecondViewController = [[MySecondViewController alloc] init];

    myFirstViewController.array = self.array;


    NSArray *array = [[NSArray alloc] initWithObjects:myFirstViewController, mySecondViewController, nil];
    UITabBarController *tab = [[UITabBarController alloc] init];
    tab.viewControllers = array;

    [array release];

    UITabBarItem *item1 = [[UITabBarItem alloc] initWithTitle:@"first title" image:nil tag:1];
    UITabBarItem *item2 = [[UITabBarItem alloc] initWithTitle:@"second title" image:nil tag:2];

    myFirstViewController.tabBarItem = item1;
    mySecondViewController.tabBarItem = item2;

    [self stopAnimatingSpinner];

    [self.navigationController pushViewController:tab animated:YES];

    [tab release];
    [item1 release];
    [item2 release];
}

Ви почали випускати свої UIViewControllers
Гарго,

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.