3

実装したSplitViewControllerが表示されない原因となっているコードのバグを見つけるために、2時間必死に取り組んでいます。奇妙なことは、コンパイル エラーが表示されず、すべてのリンクと依存関係が正しいように見えることです。

最初のロード時に画面に何も表示されません。しかし、デバイスを回転させると、正しいビューが表示されます。しかし、起動すると、すべてのビューが接続されていても、まったくビューがありません。

一部が機能するようになりました...デバッガーで、起動時に最初のView Controllerがロードされていないことがわかりました。したがって、分割ビューのView Controller配列は、最初のView Controllerで満たされていません...どうすれば修正できますか?

最初に確認したのは 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

私がチェックした 2 番目の部分は、私の RootViewController でした。問題は、tableView Entry をクリックすると、新しいビュー コントローラーが読み込まれ、表示されることです。したがって、アプリのデリゲートでは 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接続をチェックしました...何も間違っていないと思います。しかし、まだ白い画面だけです。

どうもありがとうセバスチャン

4

1 に答える 1

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

于 2012-05-19T22:07:01.887 に答える