Старый метод обработки 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: не назначать объекты свойствам несовместимых типов. Также: когда компилятор выдает предупреждение, он пытается помочь вам;-)

Другие вопросы по тегам