2 May 2010

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

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

Как видно из названия статьи я расскажу вам о том, как потратив минимум сил и времени, превратить 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



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








Плюсы:минимум времени на портирование + простота реализации.
Минусы: костыль… добавить нечего.
ссылка на исходники здесь и здесь
Мдя, какая то странная вышла статья…
Tags:UISplitViewControllerUITabBarControlleriPadXCodeObjective-C
Hubs: Development for iOS
+5
1.6k 7
Comments 6