Два UIPopovers в одном представлении
Я пытаюсь поместить два разных UIPopovers в один вид. Я довольно новичок в Objective-C и в программировании в целом, поэтому вместо умного, эффективного метода с одним поповером и изменением его содержимого в зависимости от того, как он вызывается, я просто использовал глупый, простой метод простого создания два взгляда, два делегата, два всплывающих окна и т. д. Я не знаю, из-за чего у меня возникла проблема или по какой-то другой причине.
Так вот в чем проблема. в viewdidload
вид, где появляются popovers, у меня есть этот код:
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 ответа
Вы вызываете методы alloc
+ init
вашей переменной newCurrencyViewController
но вы должны вызывать их к классу этой переменной!
Строка с ошибкой:
newCurrencyViewController =[[newCurrencyViewController alloc]init];
Результат этой строки будет newCurrencyViewController == nil
, И когда вы будете пытаться инициировать UIPopoverController
с этой точки зрения он потерпит крах, как вы описали.
Если переменная newCurrencyViewController
имеет класс, например, CurrencyViewController
тогда вы должны заменить эту строку этой:
newCurrencyViewController =[[CurrencyViewController alloc] init];
У вас нет объекта для вызова 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];
Или имя вашего пользовательского контроллера представления