UIPopViewController не работает

У меня есть xib файл с привязкой .h и .m. В xib есть UIView с textView. То, что я хотел бы сделать с этим представлением, открывает его как UIPopViewController, когда вы нажимаете кнопку.

Вот мой код:

- (IBAction)thisButton:(id)sender
{
    popViewController *popVC = [[popViewController alloc] initWithNibName:@"popViewController" bundle:nil];

    self.pop = [[UIPopoverController alloc] initWithContentViewController:popVC];

    [self.pop setPopoverContentSize:CGSizeMake(220, 120) animated:YES];
    [self.pop presentPopoverFromRect:[(UIButton *)sender frame] inView:self.view
                   permittedArrowDirections:UIPopoverArrowDirectionLeft animated:YES];
}

Он разбился со следующей ошибкой.

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UIPopoverController initWithContentViewController:] called when not running under UIUserInterfaceIdiomPad.'

Я не понимаю ошибку.

Ответ 1

Вы можете использовать UIPopoverController только в приложении iPad.

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
{
    // for iPads
    // here you can use UIPopoverController   
} else
{
    // for iPhones
}

Ответ 2

UIPopoverController работает только на iPad. В iOS 8 вы можете использовать UIPopoverPresentationController для iPhone и iPad, а там небольшой трюк, чтобы он выглядел как UIPopoverController, который объяснил ЗДЕСЬ.


Здесь Objective-C версия быстрого кода, который вы видите в ссылке, которую я предоставил.

@interface SomeViewController : UIViewController <UIPopoverPresentationControllerDelegate>
@end

@implementation SomeViewController

-(void) prepareForSegue:(UIStoryboardSegue *) segue sender:(id) sender 
{
    if ([segue.identifier isEqualToString:@"PopoverSegue"]) {
        UIViewController *controller = segue.destinationViewController;
        controller.popoverPresentationController.delegate = self;
        controller.preferredContentSize = CGSizeMake(320, 186);                
    }
}

// MARK: UIPopoverPresentationControllerDelegate

-(UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller 
{
    // Return no adaptive presentation style, use default presentation behaviour
    return UIModalPresentationNone;
}
@end

Ответ 3

Это должно сработать для вас, ребята

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"popoverSegue"])

    {
        UIViewController *popUpControl=segue.destinationViewController;
        popUpControl.modalPresentationStyle=UIModalPresentationPopover;
        popUpControl.popoverPresentationController.delegate=self;
    }
}
-(UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller
{
    return UIModalPresentationNone;
}