Не можете использовать UISplitViewController в универсальном приложении?

У меня возникли проблемы с работой UISplitViewController в универсальном приложении, где я уже закодировал часть iPhone. В качестве метода устранения неполадок я решил начать с нового проекта и просто попытаться выполнить одно действие, которое вызывает проблему, и она все еще существует.

Если я создаю универсальное приложение и в контроллере iPad создаю разделенное представление (либо в XIB, либо в коде), оно отображается черным (если я не устанавливаю цвет фона). Если я делаю это в приложении только для iPad, оно отображается просто отлично.

Я был бы признателен, если бы кто-нибудь мог проверить это самостоятельно и посмотреть, получат ли они то же самое, или сказать мне, где я ошибаюсь.

  1. В Xcode создайте универсальное приложение "Window-based".
  2. Войдите в контроллер iPad и вставьте код внизу.

Я получаю черный экран, а не разделенный вид. Тот же код работает в проекте только для iPad. Что я делаю не так, или что настроено неправильно?

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    
    UISplitViewController *split = [[UISplitViewController alloc] initWithNibName:nil bundle:nil];

    UIViewController *vc1 = [[UIViewController alloc] initWithNibName:nil bundle:nil];
    vc1.view.backgroundColor = [UIColor redColor];

    UIViewController *vc2 = [[UIViewController alloc] initWithNibName:nil bundle:nil];
    vc2.view.backgroundColor = [UIColor blueColor];

    split.viewControllers = [NSArray arrayWithObjects:vc1, vc2, nil];

    [window addSubview:split.view];
    [window makeKeyAndVisible];

    [vc1 release];
    [vc2 release];
    [split release];

    return YES;
}

person codepoet    schedule 14.08.2010    source источник


Ответы (1)


Прежде всего, вы не должны выпускать разделенное представление в didFinishLaunchingWithOptions. Добавьте его в свой интерфейс (под UIWindow) и отпустите его только при удалении. Во-вторых, создайте подкласс UISplitViewController следующим образом:

@interface MySplitViewController : UISplitViewController
{
}
@end
@implementation MySplitViewController
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return YES;
}
@end

В-третьих, ваш didFinishLaunchingWithOptions должен выглядеть так:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

    split = [[MySplitViewController alloc] init];

    UIViewController *vc1 = [[UIViewController alloc] init];
    vc1.view.backgroundColor = [UIColor redColor];

    UIViewController *vc2 = [[UIViewController alloc] init];
    vc2.view.backgroundColor = [UIColor blueColor];

    split.viewControllers = [NSArray arrayWithObjects:vc1, vc2, nil];

    [window addSubview:split.view];
    [window makeKeyAndVisible];

    [vc1 release];
    [vc2 release];

    return YES;
}
person ian    schedule 17.08.2010
comment
Вы правы с управлением памятью и дополнительным iVar. Переопределение shouldRotateToInterfaceOrientation: тоже звучит здорово, но у меня это не работает. Ты пытался? - person tonklon; 17.08.2010
comment
Если создание подкласса UISplitViewController не работает для вас, попробуйте создать подкласс каждого UIViewController и переопределить shouldRotateToInterfaceOrientation: в каждом из них. Это, наверное, лучший способ сделать это в любом случае... - person ian; 18.08.2010
comment
Это был автоповорот подконтроллеров splitview и проблема выпуска вместе взятых. - person codepoet; 20.08.2010
comment
важно то, что вы не можете инициализировать UISplitViewController с помощью initWithNibName:bundle:. Это просто не работает. Вместо этого вы должны использовать init. - person user102008; 13.10.2010