2012-01-01 3 views
3

私のコードで、私が実装している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をクリックすると、新しいView Controllerがロードされて表示されます。だから私は私のアプリケーションデリゲートではなく、 "行を選択した"テーブルビューデリゲートメソッドでVCをインスタンス化しないでください。

この

は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

+0

まあまあ...私はちょうど、splitviewcontroller.viewcontrollers配列が読み込まれたときに最初に満たされていないことを知った....どのように私はそれを修正するのですか? ご覧のとおり、テーブルビューの項目をクリックすると、その配列が更新されます。しかし、NSLogのオブジェクトを表示するためにデバッグ中に配列を記録しました。メッセージがありました:NULL "navcontrollerとfirstviewcontroller"で配列を初期化する可能性があるはずですどのように実際にはわからない – konturgestaltung

答えて

0

ありがとうございます。 UISplitViewControllerのデリゲートを設定しないと、マスタービューはポートレートモードで表示されません。マスタービューがロードされることはありません。そこに表示される白い画面は詳細ビューです。

だから、あなたは(新しいのUIViewControllerを作成し、UISplitViewControlleに変更します。あなたの分割ビューにストーリーボードにそれを割り当てることを忘れないでください)

をまたインターフェースで、それは実装作る独自のUISplitViewControllerを実装する必要がありますデリゲートをselfに設定するためのviewDidLoadメソッドで使用されます。

このプロトコルは、マスターテーブルをどこに置くかを指示します。スプリットモードでウィンドウを分割したいのですか?または、あなたはいつもどこかのボタン(通常はタブバーにあります)を押して、それを押すとマスターウィンドウがポップアップしますか?

例えば、常に表示マスタービューを持っているこの男を実装:

INTERFACE:

#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キーを押しながらドラッグするスプリットビューから任意のコントローラーに、デリゲートとして設定することをお勧めします。最初にプロトコルを実装することを忘れないでください)