2015-09-28 9 views
37

Ich verwende Code diesen CodeWie UIPopoverController korrigieren ist veraltete Warnmeldung?

mediaLibraryPopover = [[UIPopoverController alloc] 
         initWithContentViewController:avc]; 
[self.mediaLibraryPopover presentPopoverFromRect:[theButton bounds] 
          inView:theButton 
          permittedArrowDirections:UIPopoverArrowDirectionAny 
          animated:YES]; 

Und ich bin immer diese Warnung in Xcode-7.

UIPopoverController is deprecated ,first deprecated in iOS 9.0 - UIPopoverController is deprecated. Popovers are now implemented as UIViewController presentations. Use a modal presentation style of UIM 
+3

Wenn ich weiß, wie man eine Warnung entfernt, dann habe ich nicht gefragt, die Frage zu stellen. und Sie haben kommentiert, wenn Sie auch nicht wissen, wie Sie die Warnung entfernen können? –

+0

Die Verwarnungswarnung in UIStorybaordPopoverSegue.h wurde verbessert und bietet nun die Anweisung: "Access destinationViewController.popoverPresentationController aus dem performHandler Ihres Segments ..." – Mark

Antwort

91

Sie benötigen nicht mehr UIPopoverController für die Präsentation eines View-Controllers. Stattdessen können Sie den modalPresentationStyle des View-Controllers auf UIModalPresentationPopover setzen.

Sie können den folgenden Code für das verwenden:

avc.modalPresentationStyle = UIModalPresentationPopover; 
avc.popoverPresentationController.sourceView = theButton; 
[self presentViewController:avc animated:YES completion:nil]; 

UIModalPresentationPopover

In einer horizontal regelmäßigen Umgebung, einen Präsentationsstil, wo der Inhalt in einer popover Ansicht angezeigt wird. Der Hintergrundinhalt ist abgeblendet und taps außerhalb des Popover, weil das Popover abgewiesen wird. Wenn das Popover nicht durch Antippen beendet werden soll, können Sie der Eigenschaft passthroughViews des zugeordneten UIPopoverPresentationController-Objekts eine oder mehrere Ansichten zuweisen, die Sie über die Eigenschaft popoverPresentationController abrufen können. In einer horizontal kompakten Umgebung verhält sich diese Option genauso wie UIModalPresentationFullScreen.

Verfügbar in iOS 8.0 und höher.

Referenz UIModalPresentationStyle Reference


Sie müssen entweder sourceView oder barButtonItem Eigenschaft setzen, sonst wird es mit der folgenden Meldung abstürzen:

*** Beenden app aufgrund nicht abgefangene Ausnahme ' NSGenericException ', Grund:' UIPopoverPresentationController (***) sollte vor dem Auftreten der Präsentation eine nicht-null-Eigenschaft 'sourceView' oder 'barButtonItem' haben. '

Um den Popover-Pfeil korrekt zu verankern, müssen Sie auch die sourceRect-Eigenschaft angeben.

avc.modalPresentationStyle     = UIModalPresentationPopover; 
avc.popoverPresentationController.sourceView = self.view; 
avc.popoverPresentationController.sourceRect = theButton.frame; 
[self presentViewController:avc animated:YES completion:nil]; 

Siehe sourceView und sourceRect für weitere Details.

+4

Ich habe festgestellt, dass ich 'avc.popoverPresentationController.sourceView = self.view ändern musste; 'und füge' avc.popoverPresentationController.sourceRect = theButton.frame; 'hinzu, damit das Popover korrekt positioniert wird. – mark

+0

@mark hat einen guten Punkt, aber ich denke nicht, dass Sie die SourceView ändern müssen. Wenn ich das getan habe, habe ich 'avc.popoverPresentationController.sourceView = theButton; 'unverändert gelassen und einfach' avc.popoverPresentationController.sourceRect = theButton hinzugefügt.Grenzen; ' – Alex311

+1

@downvoter: Können Sie bitte erklären, warum Sie meinen niedergestimmt, so dass ich meine Antwort zu verbessern. –

-5

EDIT: In Bezug auf die Down-Stimmen. Zunächst wird ein Spaß und relevante Geschichte:

http://www.folklore.org/StoryView.py?story=Negative_2000_Lines_Of_Code.txt

Ich stellte die Antwort unten, um Programmierer zu helfen, die in den Köpfen stecken haben könnten, dass iPad/iPhone noch benötigt getrennte Ausführungspfade, wenn ein Medien Picker UI präsentiert . Zu der Zeit meines ursprünglichen Posts war dies in den anderen Antworten nicht klar. Dieser Lösungsweg vereinfacht meinen Code und die zukünftige Pflege meiner App.Ich denke, dass andere diese Perspektive nützlich finden, da manchmal das Entfernen der richtigen Codezeilen eine gute Lösung sein kann.

Ende der Bearbeitung.

Wenn Sie bereits ein Arbeitsprogramm haben und nur die Abschreibungswarnung loswerden wollen, könnte dies für Sie arbeiten.

In meinem Code und in meinem Verständnis wurden Popovers für das iPad eingeführt und sind iPad-spezifisch. Apple scheint das geändert zu haben. Also, wenn Sie bereits über ein Arbeitsprogramm, das so etwas wie diese verwendet:

if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) 
    // use popovers 
else 
    // don't use popovers 

, was Sie tun können, ist nur von dem spezifischen Code iPad loszuwerden (was wahrscheinlich ist der Code mit Popovers) und haben Ihr Programm den läuft Gleiche Anweisungen für iPhone und iPad. Das hat für mich funktioniert.

+5

Antwort ist nicht sinnvoll: Es ist selbstverständlich, dass Code zu entfernen, die eine Warnung verursacht Sie nicht wollen, wird die Warnung entfernen. – ToolmakerSteve

+0

Allerdings ist es nicht selbstverständlich, dass Sie nicht mehr benötigen spezielle Code Bei der Bildauswahl auf dem iPad für den Umgang und das ist der Punkt, den ich machen wollte. –

+0

Außerdem bedeutet Ihre Antwort, dass das Entfernen des Codes immer noch Popover-Funktionalität auf iPads bietet, was nicht der Fall ist. Es lässt die Popover-Unterstützung einfach fallen, was eine wichtige iPad-Benutzeroberfläche ist. – Markus

1

Wenn direkt von Taste Aktion wollte dann kann dieser Code

SecondViewController *destinationViewController = (SecondViewController *)[self.storyboard instantiateViewControllerWithIdentifier:@"second"]; 
destinationViewController.modalPresentationStyle = UIModalPresentationPopover; 
destinationViewController.popoverPresentationController.sourceView = self.customButton; 

// Set the correct sourceRect given the sender's bounds 
destinationViewController.popoverPresentationController.sourceRect = ((UIView *)sender).bounds; 
[self presentViewController:destinationViewController animated:YES completion:nil]; 
4

hat Apple die offizielle Art und Weise zu präsentieren und konfigurieren popovers für iOS8 hier verwendet werden: https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIPopoverPresentationController_class/index.html

Während ähnlich wie @ MidhunMP Antwort, es ist erwähnenswert, den Absatz:

die popover Präsentation Controller konfiguriert nach dem Aufruf presentViewController:animated:completion: könnte sehen m counter-intuitive, aber UIKit erstellt keinen Präsentationscontroller bis Sie eine Präsentation initiieren. Außerdem muss UIKit bis zum nächsten Aktualisierungszyklus auf warten, damit auf dem Bildschirm trotzdem neuer Inhalt angezeigt wird. Diese Verzögerung gibt Ihnen Zeit, den Präsentationscontroller für Ihr Popover zu konfigurieren.

Die Konfiguration und Reaktion auf Ereignisse kann auch über einen Delegaten erfolgen, wenn Sie möchten (https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIPopoverPresentationControllerDelegate_protocol/index.html).

Ein Beispiel, abgesehen von der Verwendung des Delegierten:

// Present the controller using the popover style. 
controller.modalPresentationStyle = UIModalPresentationPopover; 
[self presentViewController:controller animated:YES completion:nil]; 

// Popover presentation controller was created when presenting; now configure it. 
UIPopoverPresentationController *presentationController = 
     [controller popoverPresentationController]; 
presentationController.permittedArrowDirections = UIPopoverArrowDirectionLeft; 
presentationController.sourceView = containerFrameOfReferenceView; 
// arrow points out of the rect specified here 
presentationController.sourceRect = childOfContainerView.frame; 

Aber Sie wollen auch diese schließen. Um dies zu tun, ohne einen Delegaten zu verwenden, können Sie Ihre Präsentation Controller rufen Sie einfach an:

[self dismissViewControllerAnimated:YES completion:nil]; 

Aber was, wenn ich das Gerät drehen, und die popover verweist nicht auf den rechten Bereich? Ihr präsentierender Controller kann damit umgehen:

// Respond to rotations or split screen changes 
- (void)viewWillTransitionToSize:(CGSize)size 
     withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator { 
    [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator]; 
    [coordinator animateAlongsideTransition:nil 
           completion:^(id<UIViewControllerTransitionCoordinatorContext> _Nonnull context) { 
     // Fix up popover placement if necessary, after the transition. 
     if (self.presentedViewController) { 
      UIPopoverPresentationController *presentationController = 
        [self.presentedViewController popoverPresentationController]; 
      presentationController.sourceView = containerFrameOfReferenceView; 
      presentationController.sourceRect = childOfContainerView.frame; 
     } 
    }]; 
}