представление модального вида через splitView - PullRequest
0 голосов
/ 04 июня 2010

У меня проблема с созданием универсального приложения ... В делегате приложения я настроил основную навигацию для ipad и iphone:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    
 window = [[UIWindow alloc] initWithFrame:[ [UIScreen mainScreen] bounds]];
 if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
// The device is an iPad running iPhone 3.2 or later.
  [self putSplitView];
 } else {
  [self putTabBar];
 }
 [window makeKeyAndVisible]; 
 return YES;
}

- (void)putSplitView {
 RootiPadViewController *rootiPadViewController = [[RootiPadViewController alloc] init];
 UISplitViewController *splitController = [[UISplitViewController alloc] init];
 splitController.viewControllers = [NSArray 
        arrayWithObjects:rootiPadViewController.seccionesView,
                         rootiPadViewController.noticiasView, 
                         nil];
    [window addSubview:splitController.view];
}

- (void)putTabBar {
 TabBarController *tabBar = [[TabBarController alloc] init];
 [window addSubview:tabBar.view];
}

RootiPadViewController отвечает за загрузку данных и создание панелей для splitView, так что его инициализация включает в себя modalView с загрузчиком, таким образом:

@implementation RootiPadViewController

@synthesize seccionesView, noticiasView;

- (id)init {
 if ((self = [super init])) {
  SeccionesVC_iPad *sec = [[SeccionesVC_iPad alloc] init];
  NoticiasVC_iPad *not = [[NoticiasVC_iPad alloc] init];
  self.noticiasView = not;
  self.seccionesView = sec;
  Init *initVC = [[Init alloc] init];
  [self presentModalViewController:initVC animated:YES];
 }
 return self;
}

Код компилируется без предупреждений, но по какой-то причине метод loadView initVC никогда не вызывается, а модальное представление не появляется ...

Есть идеи, почему это может происходить? спасибо за вашу помощь!

Antonio

Ответы [ 2 ]

2 голосов
/ 10 января 2012

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

Если вы работаете на iPad:

После инициализации сначала вызывается viewDidLoad мастера splitViewController, а затем viewDidLoad объекта Detail.

Если вы попытаетесь поместить инициализатор модального окна в viewDidLoad Мастера, то, похоже, ничего не произойдет: это потому, что viewDidLoad Detail выполнился после viewDidLoad вашего модального представления, в результате чего ваше модальное представление было скрыто.

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

В iPhone: Не обращайте на это внимания, потому что НЕТ splitView Controller для iPhone. Фактически, проект Universal splitViewController по умолчанию обрабатывает представление Master и Detail как отдельные страницы. Поэтому при инициализации приложения все, о чем вам нужно беспокоиться, это Master viewDidLoad.

Вот почему в универсальном проекте нажатие модального представления в viewDidLoad работает так, как задумано в эмуляторе iPhone, но НИКОГДА в эмуляторе iPad.

Обратите внимание, что это применимо только на этапе viewDidLoad; если вы вставляете модальное представление ПОСЛЕ viewDidLoad в главное окно, модальное представление работает как задумано.

1 голос
/ 06 июля 2010

Возможно, вам следует представить ваш модальный ViewController из метода RootViewController 'ViewDidLoad' вместо метода 'init' ... Не уверен, что иерархия представлений будет создана в ближайшее время

...