2012-01-01 4 views
3

Я отчаянно пытаюсь в течение 2 часов найти ошибку в своем коде, что отвечает за то, что я не продемонстрировал свой SplitViewController, который я реализовал. Странно то, что не отображается ошибка компиляции и что все ссылки и зависимости кажутся правильными.SplitViewController не отображается

На первой загрузке ничего не появляется на экране. Но когда я поворачиваю устройство, я вижу правильный вид. Но при стрельбе нет никакого представления, хотя все точки зрения связаны.

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

Первая часть я проверил мой AppDelegate:

#import "AppDelegate.h" 
#import "RootViewController.h" 

@implementation AppDelegate 

@synthesize window = _window; 
@synthesize splitViewController = _splitViewController; 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    NSLog(@"%s %d", __PRETTY_FUNCTION__, __LINE__); 
    [[self window] addSubview:self.splitViewController.view]; 
    [self.window makeKeyAndVisible]; 

    return YES; 
} 



@end 

Первый View Controller

#import "FirstViewController.h" 

@implementation FirstViewController 
@synthesize toolbar; 


#pragma mark - 
#pragma mark View Lifecycle 

- (void)viewDidUnload 
{ 
    [super viewDidUnload]; 
    self.toolbar = nil; 
} 


#pragma mark - 
#pragma mark Managing the Popover 

- (void)showRootPopoverButtonItem:(UIBarButtonItem *)barButtonItem 
{ 
    NSMutableArray *itemsArray = [toolbar.items mutableCopy]; 
    [itemsArray insertObject:barButtonItem atIndex:0]; 
    [toolbar setItems:itemsArray animated:NO]; 
} 

- (void)invalidateRootPopoverButtonItem:(UIBarButtonItem *)barButtonItem 
{ 
    NSMutableArray *itemsArray = [toolbar.items mutableCopy]; 
    [itemsArray removeObject:barButtonItem]; 
    [toolbar setItems:itemsArray animated:NO]; 
} 

#pragma mark - 
#pragma mark Rotation support 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
    return YES; 
} 


@end 

Вторая часть я проверил мой RootViewController. Дело в том, что когда вы нажимаете на EntryView Entry, должен быть загружен и отображен новый контроллер представления. Поэтому я не создаю экземпляр VC в своем приложении Delegate, а в методе делегата таблицы «did select row».

Это RootViewController:

#import "RootViewController.h" 
#import "FirstViewController.h" 
#import "SecondViewController.h" 

@implementation RootViewController 
@synthesize popoverController, splitViewController, rootPopoverButtonItem; 


#pragma mark - 
#pragma mark View Lifecycle 

- (void)viewDidLoad 
{ 
    NSLog(@"%s %d", __PRETTY_FUNCTION__, __LINE__); 
    [super viewDidLoad]; 
    self.contentSizeForViewInPopover = CGSizeMake(310.0, self.tableView.rowHeight * 2.0); 
} 

- (void)viewDidUnload 
{ 
    NSLog(@"%s %d", __PRETTY_FUNCTION__, __LINE__); 
    [super viewDidUnload]; 
    self.splitViewController = nil; 
    self.rootPopoverButtonItem = nil; 
} 


#pragma mark - 
#pragma mark Rotation support 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation 
{ 
    NSLog(@"%s %d", __PRETTY_FUNCTION__, __LINE__); 
    return YES; 
} 


#pragma mark - 
#pragma mark SplitViewController delegates 

- (void)splitViewController:(UISplitViewController *)svc willHideViewController:(UIViewController *)aViewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)pc 
{ 
    NSLog(@"%s %d", __PRETTY_FUNCTION__, __LINE__); 
    barButtonItem.title = @"PolyCube Prototypes"; 

    self.popoverController = pc; 
    self.rootPopoverButtonItem = barButtonItem; 

    UIViewController <SubstitutableDetailViewController> *detailViewController = [splitViewController.viewControllers objectAtIndex:1]; 
    [detailViewController showRootPopoverButtonItem:rootPopoverButtonItem]; 
} 

- (void)splitViewController:(UISplitViewController *)svc willShowViewController:(UIViewController *)aViewController invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem 
{ 
    NSLog(@"%s %d", __PRETTY_FUNCTION__, __LINE__); 
    self.popoverController = nil; 
    self.rootPopoverButtonItem = nil; 

    UIViewController <SubstitutableDetailViewController> *detailViewController = [splitViewController.viewControllers objectAtIndex:1]; 
    [detailViewController invalidateRootPopoverButtonItem:rootPopoverButtonItem]; 
} 



#pragma mark - 
#pragma mark Table View Data Source 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    NSLog(@"%s %d", __PRETTY_FUNCTION__, __LINE__); 
    return 2; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSLog(@"%s %d", __PRETTY_FUNCTION__, __LINE__); 
    static NSString *CellIdentifier = @"RootViewControllerIdentifier"; 

    UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

    if (cell == nil) { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
    } 

    if (indexPath.row == 0) { 
     cell.textLabel.text = @"PolyCube 1"; 
    } 
    else { 
     cell.textLabel.text = @"PolyCube 2"; 
    } 

    return cell; 
} 


#pragma mark - 
#pragma mark - Table View Selection 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSLog(@"%s %d", __PRETTY_FUNCTION__, __LINE__); 
    NSUInteger row = indexPath.row; 

    UIViewController <SubstitutableDetailViewController> *detailViewController = nil; 

    if (row == 0) { 
     FirstViewController *newDetailViewController = [[FirstViewController alloc] initWithNibName:@"FirstDetailView" bundle:nil]; 
     detailViewController = newDetailViewController; 
    } 


    if (row == 1) { 
     SecondViewController *newDetailViewController = [[SecondViewController alloc] initWithNibName:@"SecondDetailView" bundle:nil]; 
     detailViewController = newDetailViewController; 
    } 


    NSArray *vcs = [[NSArray alloc] initWithObjects:self.navigationController, detailViewController, nil]; 
    splitViewController.viewControllers = vcs; 

    if (popoverController != nil) { 
     [popoverController dismissPopoverAnimated:YES]; 
    } 

    if (rootPopoverButtonItem != nil) { 
     [detailViewController showRootPopoverButtonItem:self.rootPopoverButtonItem]; 
    } 
} 

@end 

Я был бы очень признателен руку помощи ... Я не знаю, где искать больше. Я даже проверил все соединения IB ... ничего плохого, я думаю. Но все же только белый экран.

Большое спасибо Sebastian

+0

Вы загружаете файл NIB в любом месте? – craig1231

+0

ну я так думаю ... я только что узнал, что массив splitviewcontroller.viewcontrollers не заполняется изначально при загрузке ... как это исправить? Как вы можете видеть, я обновляю этот массив, когда я нажимаю на запись в виде таблицы. но я зарегистрировал массив во время отладки, чтобы показать объекты в NSLog .... и появилось сообщение: NULL Так что я думаю, что должна быть возможность инициализировать этот массив с помощью «navcontroller и firstviewcontroller» ... Но я не знаю, как на самом деле – konturgestaltung

ответ

0

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

Итак, вам нужно реализовать свой собственный UISplitViewController (создать новый UIViewController и изменить его UISplitViewControlle. Не забудь установить его в раскадровке для разделенного зрения)

Кроме того, в интерфейсе, сделать его реализацию и в методе viewDidLoad, чтобы установить делегат на себя.

В этом протоколе будет указано, где поставить основную таблицу. Вы хотите, чтобы это было в режиме разделения, разделив окно? Или, может быть, вам нужна кнопка где-то (обычно на вкладке), и когда вы нажимаете ее, появляется всплывающее окно мастера?

Например, реализовать этот парень, чтобы иметь вид мастера всегда видимую:

ИНТЕРФЕЙС:

#import <UIKit/UIKit.h> 

@interface SplitViewController : UISplitViewController <UISplitViewControllerDelegate> 

@end 

РЕАЛИЗАЦИЯ

#import "SplitViewController.h" 

@interface SplitViewController() 

@end 

@implementation SplitViewController 


- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    [self setDelegate:self]; 
} 

- (void)viewDidUnload 
{ 
    [super viewDidUnload]; 
    // Release any retained subviews of the main view. 
} 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    return YES; 
} 

-(BOOL)splitViewController:(UISplitViewController *)svc shouldHideViewController:(UIViewController *)vc inOrientation:(UIInterfaceOrientation)orientation{ 
    return NO; 
} 


@end 

Если вы не чувствуете, как реализации собственного UISplitViewController просто для обработки делегата вы также можете сделать любой из своих мастеров или контроллеров деталей для его реализации и назначить его в раскадровке (попробуйте ctrl и перетащите от просмотра с разделом до любого из вашего контроллера и установки его как делегата, не забудьте сначала выполнить протокол)