SplitViewController не отображается - PullRequest
3 голосов
/ 01 января 2012

Я отчаянно пытаюсь в течение 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

Первый контроллер View

#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. Дело в том, что когда вы нажимаете на запись в табличном представлении, новый контроллер представления должен быть загружен и отображен. Поэтому я не создаю экземпляры VC в моем делегате приложения, а в методе делегирования табличного представления «действительно выбрал строку».

Это контроллер rootview:

#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

1 Ответ

0 голосов
/ 20 мая 2012

Такое поведение ожидается. Если вы не установите делегат 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 и перетащите из разделенного вида в любой ваш контроллер и установка его в качестве делегата, не забудьте сначала реализовать протокол)

...