Wie Ed Marty schrieb bereits
Wenn Sie eine popover entlassen per Knopfdruck, einen Ort relevant einen Verweis auf die popover halten sollte
Das ist sehr wahr ; Wenn jedoch ein UIPopoverController angezeigt wird, behält die Klasse, die den Popovercontroller öffnet, diese Ressource bereits bei. Sie könnten also diese Klasse als Delegate-Klasse für Ihren Popover-Controller verwenden.
Um dies zu tun, könnten Sie Folgendes tun, die ich in meinem Code verwende. In der Klasse der popover öffnen, dies ist mein Code:
- (void)showInformationForView:(Booking*)booking frame:(CGRect)rect
{
BookingDetailsViewController *bookingView = [[BookingDetailsViewController alloc] initWithStyle:UITableViewStyleGrouped booking:booking];
[bookingView setDelegate:self];
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:bookingView];
self.popController = [[UIPopoverController alloc] initWithContentViewController:navController];
[self.popController setDelegate:self];
[self.popController setPopoverContentSize:CGSizeMake(320, 320)];
rect.size.width = 0;
[self.popController presentPopoverFromRect:rect inView:self.view permittedArrowDirections:UIPopoverArrowDirectionLeft animated:YES];
}
- (void)dismissPopoverAnimated:(BOOL)animated
{
[self.popController dismissPopoverAnimated:animated];
}
Also, was ich hier mache ein UINavigationController
und Einstellen eines BookingDetailsViewController
als rootViewController
schafft. Dann füge ich auch die aktuelle Klasse als Stellvertreter zu dieser BookingDetailsViewController
hinzu.
Die zweite Sache, die ich hinzugefügt habe, ist eine Entlassungsmethode namens dismissPopoverAnimated:animated
.
In meinem BookingDetailsViewController.h
Ich habe den folgenden Code:
[...]
@property (nonatomic, strong) id delegate;
[...]
Und in meinem BookingDetailsViewController.m
ich diesen Code hinzugefügt:
[...]
@synthesize delegate = _delegate;
- (void)viewDidLoad
{
UIBarButtonItem *closeButton = [[UIBarButtonItem alloc] initWithTitle:@"Close" style:UIBarButtonItemStylePlain target:self action:@selector(closeView)];
[self.navigationItem setRightBarButtonItem:closeButton];
[super viewDidLoad];
}
- (void)closeView
{
if ([self.delegate respondsToSelector:@selector(dismissPopoverAnimated:)]) {
[self.delegate dismissPopoverAnimated:YES];
}
else {
NSLog(@"Cannot close the view, nu such dismiss method");
}
}
[...]
Was passiert, ist, dass, wenn die Schaltfläche "Schließen" in der UINavigationController ist gedrückt, wird die Methode closeView
aufgerufen. Diese Methode überprüft, ob der Delegat auf dismissPopoverAnimated:animated
reagiert, und wenn ja, ruft er es auf. Wenn es nicht auf diese Methode reagiert, zeigt es eine Protokollmeldung an und tut nichts mehr (so wird es nicht abstürzen).
Ich habe meinen Code mit ARC geschrieben, daher gibt es keine Speicherverwaltung.
Ich hoffe, das hat dir geholfen.
danke. Ich werde den Code ändern! – SpaceDog
Der zweite Absatz ist in dieser Antwort extrem wichtig. Denken Sie daran, gemäß dem iPad-Programmierhandbuch: "Beachten Sie jedoch, dass es in Ihrer Verantwortung liegt, einen Verweis auf den Popover-Controller zu speichern, damit Sie ihn ablehnen können. Das System stellt standardmäßig kein solches bereit." Machen Sie also kein "release]" (wird trotzdem einen Absturz verursachen), bis die übergeordnete Ansicht in die Dealloc-Phase eingetreten ist. (das ist meine Sicherheitsmethode). – Jann
verwenden Sie einfach [self entlassenViewControllerAnimated: YES completion: nil]; "Der präsentierende View-Controller ist dafür zuständig, den von ihm präsentierten View-Controller zu verwerfen. Wenn Sie diese Methode auf dem vorgestellten View-Controller selbst aufrufen, leitet er die Nachricht automatisch an den präsentierenden View-Controller weiter." –