Переопределение RootViewController.xib в UISplitViewController - PullRequest
0 голосов
/ 19 декабря 2011

В настройке UISplitViewController на iPad RootViewController - это класс UIViewController с файлом XIB (не UITableViewController.)

Мое приложение имеет несколько целей.В зависимости от выбранной цели (и через #ifdef ... в коде), я хотел бы указать другой файл XIB для RootViewController.

Я думаю, что изменения должны быть сделаны в application:didFinishLaunchingWithOptions

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Add the split view controller's view to the window and display.
    self.window.rootViewController = self.splitViewController;
    [self.window makeKeyAndVisible];

    return YES;
}

== EDIT ==

Я удалил все контроллеры из MainWindow.xib, затем добавил следующие строки в AppDelegate.RootViewController запускается с соответствующей XIB, но механизм между RootVC и DetailsVC в SplitViewController не работает;то есть.при нажатии кнопки в RootVC, которая должна вызвать изменение в DefaultVC, ничего не происходит.Я явно что-то упускаю.

splitViewController = [[UISplitViewController alloc] init];

#ifdef OPTION1
    rootViewController = [[RootViewController alloc] initWithNibName:@"RootViewController_1" bundle:nil];
#elif OPTION2
    rootViewController = [[RootViewController alloc] initWithNibName:@"RootViewController_2" bundle:nil];
#endif

defaultViewController = [[[DefaultViewController alloc] init] autorelease]; 

UINavigationController *rootNav = [[[UINavigationController alloc] initWithRootViewController:rootViewController] autorelease];
UINavigationController *defaultNav = [[[UINavigationController alloc] initWithRootViewController:defaultViewController] autorelease];

splitViewController.viewControllers = [NSArray arrayWithObjects:rootNav, defaultNav, nil];
splitViewController.delegate = defaultViewController;

self.window.rootViewController = self.splitViewController;
[self.window makeKeyAndVisible];

// Add the split view controller's view to the window and display.
self.window.rootViewController = self.splitViewController;
[self.window makeKeyAndVisible];

Ответы [ 3 ]

1 голос
/ 01 июля 2012

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

Мое приложение имеет несколько целей. В зависимости от выбранной цели (и через #ifdef ... в коде), я хотел бы указать другой файл XIB для RootViewController.

Если в вашем проекте определено несколько целей, вам не нужно #ifdef s для этого. Намного проще использовать целевой механизм процесса сборки.

Допустим, у вас есть два ресурса, оба из которых называются «MyFunResource», но один вы хотите использовать в цели под названием «синий», другой - в одном, который называется «красный».

Добавьте оба ресурса в свой проект. Но в инспекторе файлов («Просмотр»> «Утилиты»> «Показать инспектор файлов») обратите внимание на раздел «Целевое членство». Обратите внимание, что все ваши цели перечислены там с флажками рядом с ними. При создании данной цели выбранный ресурс будет скопирован в пакет только в том случае, если здесь будет проверено имя этой цели.

Итак, выберите «MyFunResource», который вы хотите использовать в «красной» цели, и убедитесь, что «красная» - это единственная вещь с галочкой рядом с ней в «Target Memberships». Затем выберите тот, который вы хотите для "синий" и убедитесь, что только "синий" установлен.

Теперь, когда вы создаете красную цель, система сборки будет копировать только связанный с красным ресурс в пакет, поэтому волшебным образом красный ресурс - это то, что будет использоваться во время выполнения. И наоборот с синим. Нет кода или '# ifdef требуется.

0 голосов
/ 01 июля 2012

Я так и не нашел, как это сделать через XIB.В конце концов я сделал это программно;Я использую один XIB и заполняю его в соответствии с целью.

0 голосов
/ 19 декабря 2011

Вы можете использовать это

#ifdef Target1
self.window.rootViewController = [[RootViewController alloc] 
           initWithNibName:@"RootViewControllerTarget1" bundle:nil];
#ifdef Target2
self.window.rootViewController = [[RootViewController alloc] 
               initWithNibName:@"RootViewControllerTarget2" bundle:nil];
// etc...

initWithNibName, чтобы инициализировать контроллер указанным файлом .xib. UIViewController initWithNibName: ссылка на пакет

...