SplitViewController没有显示出来。

3
我已经拼命地花了2个小时来查找我的代码中的一个错误,这个错误导致我的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条目时,应该加载并显示一个新的视图控制器。因此,我不在我的应用程序委托中实例化VCs,而是在“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


你有在任何地方加载 NIB 文件吗? - craig1231
我想是这样的...我刚刚发现,当加载时splitviewcontroller.viewcontrollers数组最初没有填充...我该怎么办?正如您所看到的,当我点击tableview条目时,我会更新该数组。但是在调试时记录了该数组以显示NSLog中的对象....然后出现了消息:NULL因此,我认为应该有一种可能性使用“navcontroller和firstviewcontroller”初始化该数组...但我不知道实际上该怎么做 - konturgestaltung
1个回答

0

这种行为是预期的。如果您不设置 UISplitViewController 的代理,则主视图在纵向模式下将不可见。您的主视图永远不会被加载,您在那里看到的白屏是详细视图。

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

还要在接口中使其实现,并在viewDidLoad方法中将委托设置为self。

此协议将告诉您在哪里放置主表。您想像在分割模式中一样将其放在窗口中吗?或者您可能希望在某个地方(通常是在选项卡栏中)有一个按钮,当您按下它时,主窗口弹出?

例如,实现此人始终使主视图可见:

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和拖动,并将其设置为委托,请不要忘记首先实现协议)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接