MGSplitViewController не как RootView, а внутри UIViewController

Я очень новичок в программировании на iOS (из Java / C ++). Я пытаюсь настроить приложение с помощью TabBarController, одним из которых является SplitView. Я провел свое исследование, и я знаю, что UISplitview не будет работать, и везде люди рекомендуют использовать MGSplitViewController. Я просмотрел демо, но я просто не могу понять, как использовать его без его представления в корневом приложении и не может найти какой-либо пример кода, который мог бы помочь. Вот что я делаю с классами из демонстрации в отдельный класс UIViewController, который я потом добавляю в TabBarController: Это мой класс:

#import <UIKit/UIKit.h> #import "MGSplitCornersView.h" #import "RootViewController.h" #import "DetailViewController.h" @interface ChannelViewController : UIViewController { MGSplitViewController *splitViewController; RootViewController *rootViewController; DetailViewController *detailViewController; } @property (nonatomic, retain) MGSplitViewController *splitViewController; @property (nonatomic, retain) RootViewController *rootViewController; @property (nonatomic, retain) DetailViewController *detailViewController; @end 

И это моя отчаянная попытка настроить его

 - (id)initWithTabBar { self = [super init]; //this is the label on the tab button itself self.title = @"SplitView"; //use whatever image you want and add it to your project //self.tabBarItem.image = [UIImage imageNamed:@"name_gray.png"]; // set the long name shown in the navigation bar at the top [email protected]"Nav Title"; self.splitViewController = [[MGSplitViewController alloc] init]; self.rootViewController = [[RootViewController alloc] init]; self.detailViewController = [[DetailViewController alloc] init]; [self.splitViewController setDetailViewController:detailViewController]; [self.splitViewController setMasterViewController:rootViewController]; [self.view addSubview:splitViewController.view]; [self.rootViewController performSelector:@selector(selectFirstRow) withObject:nil afterDelay:0]; [self.detailViewController performSelector:@selector(configureView) withObject:nil afterDelay:0]; if (NO) { // whether to allow dragging the divider to move the split. splitViewController.splitWidth = 15.0; // make it wide enough to actually drag! splitViewController.allowsDraggingDivider = YES; } return self; } 

Думаю, я делаю что-то не так с делегатами? Или у меня что-то еще перепутано? Является ли демонстрация работой в IB, которую я не вижу в коде? Я получаю представление с разделом, но без контента и, особенно, с панелью навигации с кнопками, с которыми идет демонстрация.

Я был бы очень благодарен за подсказки или образец кода!

О, мужики, вот и мы. Это мой рабочий код для интерфейса:

 #import <UIKit/UIKit.h> #import "MGSplitViewController.h" #import "ecbView.h" #import "ecbCalc.h" @interface splitMain : MGSplitViewController <UIPopoverControllerDelegate, MGSplitViewControllerDelegate> { IBOutlet UIPopoverController* popoverController; IBOutlet UINavigationController* naviController; IBOutlet ecbCalc* viewCalcLeft; IBOutlet ecbView* euroRatesRight; UIBarButtonItem* savedButtonItem; BOOL keepMasterInPortraitMode; BOOL memoryWasDropped; BOOL viewLoaded; } @property (nonatomic, retain) UIPopoverController* popoverController; @property (nonatomic, retain) UINavigationController* naviController; @property (nonatomic, retain) ecbCalc* viewCalcLeft; @property (nonatomic, retain) ecbView* euroRatesRight; @property (nonatomic, retain) UIBarButtonItem* savedButtonItem; @property (nonatomic, readonly) BOOL keepMasterInPortraitMode; @property (nonatomic, readonly) BOOL memoryWasDropped; @property (nonatomic, readonly) BOOL viewLoaded; - (void)dismissPopoverController: (BOOL)animated; - (void)settingsChanged; @end 

и здесь выдержки из файла реализации:

 - (id)initWithCoder:(NSCoder *)aDecoder { if ((self = [super initWithCoder:aDecoder])) { // my initialization... } return self; } // Implement loadView to create a view hierarchy programmatically, without using a nib. - (void)loadView { CGRect rectFrame = CGRectMake(0.0, 20.0, 768.0, 1004.0 - 48.0); // being above a tab bar! viewLoaded = NO; self.view = [[UIView alloc] initWithFrame:rectFrame]; viewCalcLeft = [[ecbCalc alloc] initWithNibName:@"ecbCalc" bundle:nil]; euroRatesRight = [[ecbView alloc] initWithNibName:@"ecbView-iPad" bundle:nil]; naviController = [[UINavigationController alloc] initWithRootViewController:self.viewCalcLeft]; naviController.navigationBar.barStyle = UIBarStyleBlack; naviController.title = nil; viewCalcLeft.title = NSLocalizedString(@"BtnTitleCalc", @""); viewCalcLeft.view.hidden = NO; NSUserDefaults* prefs = [NSUserDefaults standardUserDefaults]; if ([prefs objectForKey:@"iPadAlwaysSplitTableView"] != nil) self.keepMasterInPortraitMode = [prefs boolForKey:@"iPadAlwaysSplitTableView"]; else self.keepMasterInPortraitMode = YES; NSArray* theViewControllers = [NSArray arrayWithObjects:self.naviController, self.euroRatesRight, nil]; [self setViewControllers:theViewControllers]; [self setDelegate:self]; [self setShowsMasterInPortrait:keepMasterInPortraitMode]; } // Implement viewDidLoad to do additional setup after loading the view, typically from a nib. - (void)viewDidLoad { // protection because this one is called twice if (viewLoaded) return; [super viewDidLoad]; if (memoryWasDropped) { if (!self.keepMasterInPortraitMode && UIInterfaceOrientationIsPortrait(self.interfaceOrientation)) { // recreate popover controller self.popoverController = [[UIPopoverController alloc] initWithContentViewController:self.viewCalcLeft]; } } viewLoaded = YES; } - (void)didReceiveMemoryWarning { // Releases the view if it doesn't have a superview. [super didReceiveMemoryWarning]; memoryWasDropped = YES; // Release any cached data, images, etc. that aren't in use. } - (void)viewDidUnload { [super viewDidUnload]; // Release any retained subviews of the main view. // eg self.myOutlet = nil; [self dismissPopoverController:NO]; self.popoverController = nil; self.naviController = nil; self.viewCalcLeft = nil; self.euroRatesRight = nil; viewLoaded = NO; } 

У моего MainWindow.xib есть UITabBarController, и кнопка для splitMain настроена для этого класса, но с пустой записью xib. Поэтому создание должно проходить через loadView. Возможно, я мог бы сделать материал viewDidLoad в loadView … но мне пришлось защищать viewDidLoad от вызова дважды. Это происходит в loadView, как только представление создается из класса MGSplitViewController, потому что initWithCoder вызывает [self setup] . В этой функции прямоугольник rect вычисляется с помощью self.view.bounds, так что viewDidLoad вызывается снова, потому что вид еще не существует. Возможно, можно было бы реализовать обходной путь в MGSplitViewController.m, но я был слишком ленив, делая это.

Чтобы это работало на контроллере панели вкладок, убедитесь, что вы выполняете большинство изменений, опубликованных на git-странице MGSplitViewController. Удачи.

Interesting Posts
Давайте будем гением компьютера.