Два UIPopovers в одном представлении - PullRequest
0 голосов
/ 09 сентября 2011

Я пытаюсь поместить два разных UIPopovers в один вид. Я довольно новичок в Objective-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, который появляется внутри popover 1 (с контроллером popover, называемым «popoverController»), а newCurrencyViewController - это vc, который появляется внутри popover 2 (с контроллером popover, называемым «newCurrencyPopoverController»).

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

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

Также есть предупреждение «метод экземпляра -alloc не найден (тип возвращаемого значения по умолчанию равен id)» для строки, которая

saysnewCurrencyViewController =[[newCurrencyViewController alloc]init];

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

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

ЛУКА

Ответы [ 2 ]

1 голос
/ 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];

или без именивашего пользовательского контроллера представления

1 голос
/ 09 сентября 2011

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

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

newCurrencyViewController =[[newCurrencyViewController alloc]init];

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

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

newCurrencyViewController =[[CurrencyViewController alloc] init];
...