Два UIPopover в одном представлении

Я пытаюсь разместить два разных UIPopovers в одном представлении. Я новичок в target-c и программировании в целом, поэтому вместо того, чтобы использовать умный и эффективный метод создания одного всплывающего окна и изменения его содержимого в зависимости от того, как оно называется, я просто использовал глупый, простой метод создания два представления, два делегата, два всплывающих окна и т. д. Я не знаю, поэтому у меня проблема или по какой-то другой причине.

Так вот проблема. В viewdidload представления, где появляются всплывающие окна, у меня есть этот код:

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {

    optionsViewController =[[OptionsViewController alloc]init];
    optionsViewController.delegate = self;
    popoverController = [[UIPopoverController alloc] initWithContentViewController:optionsViewController];
    popoverController.popoverContentSize = CGSizeMake(320, 216);
    [popoverController setDelegate:self];

    newCurrencyViewController =[[newCurrencyViewController alloc]init];
    newCurrencyViewController.delegate = self;
    newCurrencyPopoverController = [[UIPopoverController alloc] initWithContentViewController:newCurrencyViewController];
    newCurrencyPopoverController.popoverContentSize = CGSizeMake(320, 216);
    [newCurrencyPopoverController setDelegate:self];


}

Очевидно, что optionsViewController — это vc, который появляется внутри всплывающего окна 1 (с контроллером всплывающего окна, называемым «popoverController»), а newCurrencyViewController — это vc, который появляется внутри всплывающего окна 2 (с контроллером всплывающего окна, называемым «newCurrencyPopoverController»).

Каждый раз при загрузке представления приложение вылетает с ошибкой SIGABRT, а в консоли пишет:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UIPopoverController initWithContentViewController:] must not be called with `nil`.'

Кроме того, для строки, которая

saysnewCurrencyViewController =[[newCurrencyViewController alloc]init];

Моя первая мысль заключалась в том, что я где-то ошибся в имени файла, так как я думаю, что проблема в том, что он не находит файл с именем newCurrencyPopoverController, но я все проверил и не могу найти никаких ошибок или чего-то еще. Есть идеи?

Большое спасибо!

ЛЮК


person Luke Baumann    schedule 09.09.2011    source источник


Ответы (2)


Вы вызываете методы alloc + init вашей переменной newCurrencyViewController, но вы должны вызывать их в классе этой переменной!

Строка с ошибкой:

newCurrencyViewController =[[newCurrencyViewController alloc]init];

Результат этой строки будет newCurrencyViewController == nil. И когда вы попытаетесь инициализировать UIPopoverController с этим представлением, произойдет сбой, как вы описали.

Если переменная newCurrencyViewController относится к классу, например, CurrencyViewController, то вы должны заменить эту строку на эту:

newCurrencyViewController =[[CurrencyViewController alloc] init];
person Nekto    schedule 09.09.2011
comment
Хорошее объяснение ошибки. +1 за это. - person Moshe; 09.09.2011

у вас нет объекта для вызова alloc и init, когда вы вызываете newCurrenceViewController.

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {

    optionsViewController =[[OptionsViewController alloc]init];
    optionsViewController.delegate = self;
    popoverController = [[UIPopoverController alloc] initWithContentViewController:optionsViewController];
    popoverController.popoverContentSize = CGSizeMake(320, 216);
    [popoverController setDelegate:self];

    //Here is your problem---------------------------------------------
    newCurrencyViewController =[[newCurrencyViewController alloc]init];
    //-----------------------------------------------------------------

    newCurrencyViewController.delegate = self;
    newCurrencyPopoverController = [[UIPopoverController alloc] initWithContentViewController:newCurrencyViewController];
    newCurrencyPopoverController.popoverContentSize = CGSizeMake(320, 216);
    [newCurrencyPopoverController setDelegate:self];


}

вы, вероятно, хотите что-то более похожее на

newCurrencyViewController = [[UICurrencyViewController alloc] init];

Или w/e имя вашего пользовательского контроллера представления

person ColdLogic    schedule 09.09.2011
comment
Большое спасибо. Дал только парню над тобой, потому что он был первым, но все равно спасибо. +1 - person Luke Baumann; 10.09.2011
comment
@Nekto: Хм, когда я писал свой пост, твой был далеко не полезен. Вы редактировали его, пока я писал свой пост, и у вас даже есть принятый ответ. Не уверен, на что вы жалуетесь. - person ColdLogic; 12.09.2011
comment
Возможно, вам следует прочитать весь пост, который я поставил, прежде чем ставить свой неправильный. UICurrencyViewController — это заполнитель для класса, который действительно нужен исходному плакату. Это эквивалентно вашему CurrencyViewController. Мой пост объясняет это. - person ColdLogic; 13.09.2011