Старый метод обработки UIPopovers не работает; скопировал код, теперь получаю сбой
**** ОБНОВЛЕНИЕ **, получая следующее падение: [UploadViewController _viewForPresenting]: нераспознанный селектор отправлен на экземпляр 0x7abe4c00**
Старый способ использования UIPopOvers устарел в iOS 8; поэтому я попытался обновить; к сожалению это не работает. Я не получаю всплывающее окно как таковое, только верхнюю часть текущего представления внизу (см. Изображение здесь). Я уверен, что здесь чего-то не хватает, но, потратив на это 2 дня, я не вижу проблемы. Я был в стороне от кодирования, поэтому я прошу помощи в решении этой проблемы кодирования. Это мой код (скопирован и изменен здесь):
// make the popover
UIViewController * popoverContent = [UIViewController new];
UIView* popoverView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 614, 804)];
popoverView.backgroundColor = [UIColor colorWithWhite:(CGFloat)1.0 alpha:(CGFloat)1.0]; // frame color?
popoverContent.view = popoverView;
//resize the popover view shown in the current view to the view's size
popoverContent.preferredContentSize = CGSizeMake(614, 804);
// NSString *urlAddress = @"https://google.com";
NSString *urlAddress = @"http://pragerphoneapps.com/upload-help/";
NSURL *url = [NSURL URLWithString:urlAddress];
NSURLRequest *requestObj = [NSURLRequest requestWithURL:url];
// add the UIWebView for RichText
UIWebView *webView = [[UIWebView alloc] initWithFrame: popoverView.frame];
webView.backgroundColor = [UIColor whiteColor]; // change background color here
// add the webView to the popover
[webView loadRequest:requestObj];
[popoverView addSubview:webView];
//create a popover controller
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
UIViewController *controller = [storyboard instantiateViewControllerWithIdentifier:@"UploadViewController"];
// present the controller
controller.modalPresentationStyle = UIModalPresentationPopover;
[self presentViewController: controller animated:YES completion:nil];
// configure the Popover presentation controller
UIPopoverPresentationController *popController = [controller popoverPresentationController];
popController.permittedArrowDirections = UIPopoverArrowDirectionUp;
// get warning on the following line: Incompatible pointer types assigning to 'UIBarButtonItem * _Nullable' from 'UploadViewController *'
popController.barButtonItem = self;
// also get warning on the following line: Assigning to 'id<UIPopoverPresentationControllerDelegate> _Nullable' from incompatible type 'UploadViewController *const __strong'
popController.delegate = self;
popController.sourceView = popoverView;
popController.sourceRect = CGRectMake(10, 10, 614, 804);
1 ответ
Прочитайте предупреждение, которое вы получаете:
// get warning on the following line: Incompatible pointer types assigning to 'UIBarButtonItem * _Nullable' from 'UploadViewController *'
popController.barButtonItem = self;
UIPopoverPresentationController
"s barButtonItem
собственность должна быть UIBarButtonItem
, Вы устанавливаете его на свой контроллер представления, который не является UIBarButtonItem
, В результате UIKit пытается отправить сообщения вашему контроллеру представления, которые UIBarButtonItem
будет в состоянии принять, но так как ваш контроллер представления не является UIBarButtonItem
, он не знает, как обрабатывать эти сообщения, и вы терпите крах.
Кроме того, исправьте это, пока вы на это:
// also get warning on the following line: Assigning to 'id<UIPopoverPresentationControllerDelegate> _Nullable' from incompatible type 'UploadViewController *const __strong'
popController.delegate = self;
Это легко исправить; просто сделай свой UploadViewController
класс соответствует UIPopoverPresentationControllerDelegate
протокол (и реализовать любые методы, которые вам нужны, чтобы он функционировал должным образом).
Tl; dr: не назначать объекты свойствам несовместимых типов. Также: когда компилятор выдает предупреждение, он пытается помочь вам;-)