wake-up-neo.com

UIPopoverPresentationController auf dem iPhone erzeugt kein Popover

Ich versuche, die neue UIPopoverPresentationController in meiner iPhone-App zu implementieren (mit Objective C). Was ich will, ist ein einfaches Popover mit einer Tableview, die von der Initiierungsschaltfläche ausgeht.

--Edit--

Hier ist meinÜBERARBEITETERCode, angepasst an die Recherche in den Dokumenten, SO und aus den Eingaben in den Kommentaren:

- (IBAction)selectCategoryBtn:(UIButton *)sender
{
    [self performSegueWithIdentifier:@"CatSelectSegue" sender:self.selCatButton];
}

-(void) prepareForSegue:(UIStoryboardSegue *) segue Sender:(id) sender
{
    if (sender == self.selCatButton)
    {
        if ([segue.identifier isEqualToString:@"CatSelectSegue"])
        {
            UIPopoverPresentationController *controller = segue.destinationViewController;
            controller.delegate = self;
            controller.sourceView = self.selCatButton;
            controller.sourceRect = self.selCatButton.frame;
        }
    }
}


-(UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller
{
    return UIModalPresentationNone;

Hier ist mein Storyboard-Anschluss:

enter image description here

Dies stellt jedoch lediglich eine Tabellenansicht in modaler Form dar, die von unten nach oben steigt und den gesamten Bildschirm verbraucht.

Ich habe gegoogelt und überall nach SO gesucht, aber es scheint, dass ich nicht der einzige bin, der von dem, was ich gehofft hatte, ein Problem mit dem iPhone lösen würde.

Kann jemand eine Störung in meinem Code sehen oder mich zu einem klaren Tutorial verweisen? Ich habe nachgesehen, aber vielleicht ist die API so neu, dass noch niemand damit umgehen kann.

Vielen Dank!

2. edit:

Folgendes wird als Ergebnis des obigen Codes dargestellt. Ich habe die Größe des TableView im View Controller reduziert, von dem ich erwartet hatte, dass er als Popover dargestellt wird. Ich habe den Hintergrund grau eingefärbt, nur um zu klären, was anstelle des Popovers angezeigt wird.

enter image description here

27
rattletrap99

Schritte:

A) Verknüpfen Sie Ihr UIButton mit dem View-Controller des Popovers mit dem Segue-Typ Present As Popover. Ich musste tatsächlich ein neues Projekt erstellen, um dieses erscheinen zu lassen, aber es ist wahrscheinlich etwas mit dem Basis-SDK zu tun.

B) Stellen Sie sicher, dass der View Controller, der UIButton enthält, dem <UIPopoverPresentationControllerDelegate> entspricht. Z.B. Fügen Sie in Ihrer MyViewController.m -Datei Folgendes hinzu:

@interface MyViewController () <UIPopoverPresentationControllerDelegate>

C) Fügen Sie die folgende Methode dem View Controller hinzu, der UIButton enthält:

- (UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller {

    return UIModalPresentationNone;
}

D) Fügen Sie Folgendes in Ihren prepareForSegue:sender: ein, der Ihren segue.identifier Check ersetzt:

if ([segue.identifier isEqualToString:@"CatSelectSegue"]) {
    UIViewController *dvc = segue.destinationViewController;
    UIPopoverPresentationController *controller = dvc.popoverPresentationController;
    if (controller) {
        controller.delegate = self;
    }
}

Code getestet und Beweis, dass es funktioniert:

Popover on iPhone without 3rd Party Controls

Bearbeiten: Meine Test-App TPOPViewController.m, wo der Zauber passiert:

#import "TPOPViewController.h"

@interface TPOPViewController () <UIPopoverPresentationControllerDelegate>//, UIAdaptivePresentationControllerDelegate>

@end

@implementation TPOPViewController

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

    NSString *identifier = segue.identifier;
    if ([identifier isEqualToString:@"popover"]) {
        UIViewController *dvc = segue.destinationViewController;
        UIPopoverPresentationController *ppc = dvc.popoverPresentationController;
        if (ppc) {
            if ([sender isKindOfClass:[UIButton class]]) { // Assumes the popover is being triggered by a UIButton
                ppc.sourceView = (UIButton *)sender;
                ppc.sourceRect = [(UIButton *)sender bounds];
            }
            ppc.delegate = self;
        }
    }
}

- (UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller {

    return UIModalPresentationNone;
}

@end

Auch mein Test-Storyboard:

Popover on iPhone test storyboard

71
Robotic Cat

Anscheinend funktioniert die obige Methode nicht mehr mit iOS9/Xcode7 . Dies liegt daran, dass Xcode ihn beim Kompilieren Ihrer Anwendung ignoriert, wenn Sie den Schnittstil mit "Interface-Builder" auf "Popover" setzen. Darüber hinaus wird beim nächsten Öffnen Ihres Projekts automatisch wieder auf "Push" gesetzt. Wenn Sie über eine Versionskontrollsoftware wie Git verfügen, können Sie diese unerwünschte Änderung beobachten.

Es ist jedoch immer noch möglich, Popovers im iPad-Stil auf dem iPhone abzurufen, wenn Sie den View-Controller, den Sie als Popover anzeigen möchten, manuell durch präsentieren. Beispiel für einen Swift-Code:

//  ViewController.Swift
//  PopoverDemo
//
//  Created by bhnascar on 12/2/15.
//  Copyright © 2015 bhnascar. All rights reserved.
//

import UIKit

class ViewController: UIViewController, UIPopoverPresentationControllerDelegate {

    /* The bar button item that will present the popover. */
    var popoverButton: UIBarButtonItem?

    override func viewDidLoad() {
        super.viewDidLoad()
        popoverButton = UIBarButtonItem(title: "Pop!", style: UIBarButtonItemStyle.Plain, target: self, action: "presentPopover")
        self.navigationItem.rightBarButtonItem = popoverButton
    }

    // Mark: - UIPopoverPresentationControllerDelegate

    func prepareForPopoverPresentation(popoverPresentationController: UIPopoverPresentationController) {
        popoverPresentationController.permittedArrowDirections = .any
        popoverPresentationController.barButtonItem = popoverButton
    }

    func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {
        return .none
    }

    // Mark: - Callback function for popover button.

    func presentPopover() {
        let popoverContentController = UIViewController()
        popoverContentController.view.backgroundColor = .blue

        // Set your popover size.
        popoverContentController.preferredContentSize = CGSize(width: 300, height: 300)

        // Set the presentation style to modal so that the above methods get called.
        popoverContentController.modalPresentationStyle = .popover

        // Set the popover presentation controller delegate so that the above methods get called.
        popoverContentController.popoverPresentationController!.delegate = self

        // Present the popover.
        self.present(popoverContentController, animated: true, completion: nil)
    }

}
18
bhnascar

Swift 3.X

Dadurch wird das Popover in der Mitte des Bildschirms angezeigt

class CommonViewController: UIViewController, UIPopoverPresentationControllerDelegate{

func adaptivePresentationStyle(
for controller: UIPresentationController,
    traitCollection: UITraitCollection)
    -> UIModalPresentationStyle {
        return .none
}

func showPopover(){
    let storyboard = UIStoryboard(name: "Pickers", bundle: nil)
    let myViewController = UIViewController()
    myViewController.preferredContentSize = CGSize(width: 320, height: 200)
    myViewController.modalPresentationStyle = .popover

    let popOver = myViewController.popoverPresentationController
    popOver?.delegate = self

    self.present(myViewController, animated: true, completion: nil)
    popOver?.permittedArrowDirections = .init(rawValue: 0)
    popOver?.sourceView = self.view

    let rect = CGRect(
        Origin: CGPoint(x: self.view.frame.width/2, y: self.view.frame.height/2),
        size: CGSize(width: 1, height: 1)
    )
    popOver?.sourceRect = rect
}
4
tsik

So präsentieren Sie den UIModalPresentationStyle-Popover vom iPhone/iPad:

-(void)menuButtonPressed:(UIButton *)sender {

    self.menuPopoverController = [[DownloadMenuPopoverController alloc] initWithStyle:UITableViewStylePlain];
    self.menuPopoverController.delegate = self;

    self.menuPopoverController.modalPresentationStyle = UIModalPresentationPopover;
    self.menuPopoverController.popoverPresentationController.delegate = self;
    self.menuPopoverController.preferredContentSize = CGSizeMake(250,80);
    self.menuPopoverController.popoverPresentationController.sourceRect = sender.frame;// rect to show view
    self.menuPopoverController.popoverPresentationController.sourceView = self.view;

    UIPopoverPresentationController *popPC = self.menuPopoverController.popoverPresentationController;
    popPC.permittedArrowDirections = UIPopoverArrowDirectionAny;
    popPC.delegate = self;
    [self presentViewController:self.menuPopoverController animated:YES completion:nil];

}

#pragma mark - UIPresentationController Delegate methods

- (UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller traitCollection:(UITraitCollection *)traitCollection {
    return UIModalPresentationNone;
}

- (UIViewController *)presentationController:(UIPresentationController *)controller viewControllerForAdaptivePresentationStyle:(UIModalPresentationStyle)style {
    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:controller.presentedViewController];
    return navController;
}
0
Harshal Wani