Легким движением руки UITabBarController превращается в UISplitViewController

    Доброй ночи/утра/дня/вечера

    Как видно из названия статьи я расскажу вам о том, как потратив минимум сил и времени, превратить iPhone`ский UITabBarController в iPad`овский “UISplitViewController”
    Для этого нам понадобится: проект(под iPad) с предыдущего моего рассказа, xib файл(под iPhone) с UITabBarController'ом и класс-контроллер к нему. Первое у меня было. Что касается второго и третьего, то я быстро создал xib в Interface Builder'е и дал ему незамысловатое имя iPhoneTabBar.xib.




    Так как наш UITabBarController создавался лишь для демонстрации, то я…
    вообщем нихреначего он не умеет делать. Единственное что я добавил — это UIAlertView, которое выскакивает при нажатии на кнопку Click Me(находится на одной из закладок). Код приведен ниже

    iPhoneTabBar.h
    #import <UIKit/UIKit.h>

    @interface iPhoneTabBar : UITabBarController {  }
    -(IBAction) showAlert;
    @end


    * This source code was highlighted with Source Code Highlighter.

    iPhoneTabBar.m
    #import "iPhoneTabBar.h"
    @implementation iPhoneTabBar
    -(IBAction) showAlert{
      UIAlertView* alert= [[UIAlertView alloc] initWithTitle:@"Title"
                             message:@"message"
                             delegate:nil
                        cancelButtonTitle:@"Ok"
                        otherButtonTitles:nil];
      [alert show];
      [alert release];
    }
    - (void)didReceiveMemoryWarning {
      // Releases the view if it doesn't have a superview.
      [super didReceiveMemoryWarning];
      
      // Release any cached data, images, etc that aren't in use.
    }
    - (void)viewDidUnload {
      [super viewDidUnload];
      // Release any retained subviews of the main view.
      // e.g. self.myOutlet = nil;
    }
    - (void)dealloc {
      [super dealloc];
    }
    @end


    * This source code was highlighted with Source Code Highlighter.

    Ну что ж, начнем. Открыв проект с предыдущей моей статьи добавим в него наш TabBar. Выглядеть это будет так:



    Теперь модифицируем наш класс MasterViewController.
    В заголовочный файл добавим IBOutlet переменную — указатель на класс контроллер iPhoneTabBar. Это позволит нам при выборе пользователем пункта меню в левой части SplitViewControllera сообщать UITabBarу, что нужно показать соответсвующую страницу+ еще кое что.

    MasterViewController.h
    #import <UIKit/UIKit.h>
    @class DetailViewController;
    @class iPhoneTabBar;
    @interface MasterViewController : UITableViewController {
      IBOutlet DetailViewController* detailViewController;
      IBOutlet iPhoneTabBar* iphoneTabBar;
    }

    @end


    * This source code was highlighted with Source Code Highlighter.


    А теперь самое главное: в реализации класса MasterViewController следует добавить(или заменить, если он был раньше) метод viewDidLoad, который будет вызываться сразу после загрузки view. В нем мы помещаем на нашу detailView содержимое (если точней выражаться то саму view) UITabBarController'a, предварительно спрятав панельку UITabBar, которая внизу
    -(void) viewDidLoad{
      [super viewDidLoad];
      iphoneTabBar.view.frame=CGRectMake(0, 0, detailViewController.view.frame.size.width,detailViewController.view.frame.size.height+49);
      iphoneTabBar.tabBar.hidden=TRUE;
      [detailViewController.view insertSubview:iphoneTabBar.view atIndex:1];
    }

    * This source code was highlighted with Source Code Highlighter.

    При выборе пользователем одной из ячеек таблицы(didSelectRowAtIndexPath) мы должны переключится на новую страницу UITabBar'a
    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
        iphoneTabBar.selectedViewController = [iphoneTabBar.viewControllers objectAtIndex:indexPath.row];
    }

    * This source code was highlighted with Source Code Highlighter.

    Последние штрихи: открыв в InterfaceBuilder'e iPhoneTabBar.xib и AlternativeSplitViewController.xib перетащим(или просто скопируем) с первого во второй UITabBarController. Еще надо связать нашу IBOutlet переменную с этим UITabBarController



    Вот и все)
    Несколько скриншотов ниже:








    Плюсы:минимум времени на портирование + простота реализации.
    Минусы: костыль… добавить нечего.
    ссылка на исходники здесь и здесь
    Мдя, какая то странная вышла статья…

    Средняя зарплата в IT

    113 000 ₽/мес.
    Средняя зарплата по всем IT-специализациям на основании 5 444 анкет, за 2-ое пол. 2020 года Узнать свою зарплату
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 6

      0
      а как у вас смена контролеров внутри одного XIB'a сделана? (пытаюс сделать landscape only приложение при смене XIB опять в портретное уходит)
        0
        Хреноватая у вас замена UISplitViewController вышла.
        Где человеческая смена ориентации с поповером?
        Судя по предыдущей вашей статье, вы его недолюбливаете. Почему?
          0
          Это всего лишь пример как можно сделать то же, но дедовским способом. Да и хотелось показать, как UITabBarController с помощью небольшой переделки превращался в что-то похожее на UISplitViewController. То что оно не доведено до конца… соглашусь моя «заслуга» (время, его всегда маловато.)

          «Судя по предыдущей вашей статье, вы его недолюбливаете. Почему?»
          В предыдущей статье написано, почему была предложена альтернатива — из-за того, что MasterView прячется в книжной ориентации (иногда это не требуется- см. окно настроек iPad ) + это все делалось с беткой SDK 3.2 и там наблюдалась вот какая нехорошая вещь: UISplitViewController ну никак не хотел добавляться в UINavigationController. Как дела состоят сейчас с этим делом я не могу сказать точно.
            0
            «и там наблюдалась вот какая нехорошая вещь: UISplitViewController ну никак не хотел добавляться в UINavigationController.»
            это наблюдается везде.
            почему? да потому что UISplitViewController ДОЛЖЕН БЫТЬ ГЛАВНЫМ view controller'ом.
            и это не исчезло.
            ну, добавьте уже и поповер, дабы код можно было взять и использовать (я-то уже давненько написал свой полный аналог).
              0
              Смешно звучит, но нет времени. Вы заметили сколько дней прошло между первой и второй «статьей»…
              Да и цель была не сделать(я бы выложил исходники и незаморачивался на деланье никому не нужных картинок в стиле «как добавить три файла в проект» и «как это будет выглядеть после добавления»), а показать как делается(процесс).
              А насчет «написал свой полный аналог» хорошо было бы, если бы Вы опубликовали статью с описанием полного аналога и само собой исходниками. Авось работы кому-то будет поменьше при кодинге приложений под iPad + я почитаю как сделали Вы, буду рад критике этой статьи. Правда тут возникает много вопросов и первый из них — зачем делиться чем-то, на что было потрачено время, бесплатно.
                +1
                зачем? да просто так. всё равно делалось под конкретный проект.
                а статью напишу, да

        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

        Самое читаемое