2012-01-01 54 views
3

我拼命尝试2h现在在我的代码中找到一个错误,这是负责不显示我已经实现的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 

的第一个视图控制器

#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的。事情是,当你点击一个tableView Entry时,一个新的视图控制器应该被加载并显示出来。所以我没有在我的应用程序委托中实例化VC,而是在“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连接......我认为没有错。但仍然只是一个白色的屏幕。

谢谢你这么多 塞巴斯蒂安

+0

要在任何地方加载NIB文件吗? – craig1231 2012-01-01 21:06:42

+0

以及我认为是这样的......我刚刚发现,splitviewcontroller.viewcontrollers数组最初没有填充时加载....我该如何解决? 正如你所看到的,当我点击一个tableview条目时,我更新了这个数组。但我记录数组,同时调试显示在NSLog中的对象....并有消息:NULL 所以我认为应该有一种可能性,以“navcontroller和firstviewcontroller”初始化该数组... ...但我不知道如何实际 – konturgestaltung 2012-01-01 21:11:54

回答

0

这是正常现象。如果您没有设置UISplitViewController的委托,那么在纵向模式下主视图将不可见。您的主视图从不加载,您看到的白色屏幕是您的详细视图。

所以,你需要实现自己的UISplitViewController(创建一个新的UIViewController并将其更改为UISplitViewControlle。不要忘记它的故事板中分配给您的拆分视图)

另外在界面,使之实现并在viewDidLoad方法中将委托设置为self。

该协议将告诉放置主表的位置。你想在分裂模式下分割窗口吗?或者也许你想要一个按钮(通常在一个tabbar),当你按下它的主窗口弹出窗口?

举例来说,实现这个家伙有主视图始终可见:

接口:

#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并拖动从分割视图到任何控制器并将其设置为委托,不要忘记首先实现协议)

相关问题