dismissViewController: funktioniert nicht
Ich habe einen view-controller genannt vc0, welches wie dieses:
[self presentViewController: vc1 animated: YES completion: nil];
Und in vc1 habe ich einen button zu präsentieren, ein weiteres view-controller:
[self presentViewController: vc2 animated: YES completion: nil];
Dann in vc2, ich habe eine Schaltfläche zum schließen des view-controller:
[self dismissViewControllerAnimated:YES completion: ^{
//over here I call one method in vc1
}
Und wie erwartet gibt es zurück an vc1.. aber es ist eine Schaltfläche, die in vc1 zurück zu gehen, um vc0 durch schließen des view-controller wie diesem:
[self dismissViewControllerAnimated:YES completion:nil];
Aber aus irgendeinem Grund funktioniert es nicht, die view-controller nicht entlassen, zurück zu vc0. Wenn ich zunächst vc1, kann ich drücken Sie die Schaltfläche zum schließen des view-controller und es funktioniert. Aber wenn ich auf den Knopf drücke zum öffnen vc2, und wenn ich entlassen vc2 zurück, vc1, und DANN drücke ich die Taste zum schließen des view-controller, das ist, wenn es nicht funktioniert.
Sorry, wenn die Frage ist ein bisschen unklar, es ist ein bisschen schwer zu formulieren, was ich zu sagen versuche.
Auch eine weitere Sache:
Ich versucht, anstelle dismissViewControllerAnimated:
im vc1 manuell zu präsentieren vc0, aber dann bekomme ich ein log in der Konsole zu sagen, dass ich versucht bin, eine vc0, aber vc1 ist der Ansicht, nicht in die Fenster-Hierarchie. Was bedeutet das?
Danke für die Hilfe!
UPDATE:
IN DIESEM FALL VC0 IST MenuMileIndexViewController
- VC1 IST FlightViewController
- VC2 IST BookmarksTableViewController
Hier ist der code eingebunden:
MenuMileIndexViewController:
- (IBAction)goToOriginPage {
FlightRecorder *origin = [[FlightRecorder alloc] init];
[self presentViewController:origin animated:YES completion:nil];
}
Flight Recorder:
- (void)searchBarBookmarkButtonClicked:(UISearchBar *)searchBar {
[self bringUpBookmarkkTable];
}
- (void) bringUpBookmarkkTable {
BookmarkTableViewController *bookmarkTVC = [[BookmarkTableViewController alloc] init];
[bookmarkTVC setModalTransitionStyle: UIModalTransitionStyleFlipHorizontal];
[self presentViewController:bookmarkTVC animated:YES completion:nil];
}
- (IBAction)cancel {
[self dismissViewControllerAnimated:YES completion:nil];
}
- (void)endBookmarkProcessWithBookmarkCollection: (NSDictionary *)dict {
presetBookmarkContext = [dict mutableCopy];
bookmarkMode = YES;
NSString *compiledText = nil;
NSNumber *number1 = [NSNumber numberWithInt: 1];
if ([dict objectForKey: @"bookmarkTag"] == number1) {
compiledText = [NSString stringWithFormat: @"%@ to %@", [dict objectForKey: @"origin"], [dict objectForKey: @"destination"]];
}
else {
compiledText = [NSString stringWithFormat: @"%@ to %@", [dict objectForKey: @"destination"], [dict objectForKey: @"origin"]];
}
compiledText = [compiledText stringByReplacingOccurrencesOfString:@"Origin: " withString:@""];
compiledText = [compiledText stringByReplacingOccurrencesOfString:@"Destination: " withString:@""];
flightContext = [NSDictionary dictionaryWithObjectsAndKeys: [dict objectForKey: @"miles"], @"miles", compiledText, @"location", [[NSUserDefaults standardUserDefaults] objectForKey: @"tempD"], @"date", nil];
NSString *string = [NSString stringWithFormat: @"\nMiles: %.2f\nFlight: %@\nDate: %@", [[dict objectForKey: @"miles"] floatValue], compiledText, [[NSUserDefaults standardUserDefaults] objectForKey:@"tempD"]];
UIAlertView *bvkBookmarkAlertView = [[UIAlertView alloc] initWithTitle:@"Confirmation" message:string delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Add", nil];
[bvkBookmarkAlertView show];
}
- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex {
if (buttonIndex == 1) {
[self cancel]; //Even though cancel is an IBAction, IBAction is the same thing as void so it is callable
}
}
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
if (buttonIndex == 1) {
[TheMileIndexViewController addDesiredMilesToIndex: [[flightContext objectForKey: @"miles"] doubleValue]];
[TravelLogViewController addFlight: flightContext];
if (!bookmarkMode) {
if ([checkbox isSelected]) {
[BookmarkHandler uploadBookmark: bookmarkFlightContext];
}
}
}
if (buttonIndex == 0) {
if ([alertView.title isEqualToString: @"Confirmation"]) {
bookmarkMode = NO;
}
}
}
BookmarksTableViewController:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
[tableView deselectRowAtIndexPath:indexPath animated: YES];
NSDictionary *dict = [[BookmarkHandler bookmarkCollection] objectAtIndex: indexPath.row];
fl = [[FlightRecorder alloc] init];
[self dismissViewControllerAnimated:YES completion:^{
[fl endBookmarkProcessWithBookmarkCollection: dict];
}];
}
NUN, habe ich eine Bildschirm Aufnahme der app in den simulator, der zeigt, was das problem ist. Ich kann E-Mail, dass Sie sich für die Referenz. So kann ich E-Mail, dass Sie.
wie und wo werden Sie die Aktion für die Schaltfläche?
In der xib-Datei
1. "Was hat das zu bedeuten?": Es s weil Sie erstellen eine neue Instanz von vc0, indem Sie "manuell vorhanden vc0". 2. Was tun Sie mit "// hier rufe ich eine Methode in vc1"?
InformationsquelleAutor MCKapur | 2012-09-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich würde empfehlen, immer zu entlassen, VC von VC, die tatsächlich präsentiert es - mit Hilfe eines Delegaten. Dies ist eigentlich auch der von Apple empfohlene Weg war - wie bereits in vorherigen Antwort auf meine Frage zu diesem Thema.
Also, wenn Sie VC0 präsentiert VC1, die entlassen VC1-code in VC0 auch mit Stellvertretung-Schema.
Habe ich gelernt, dass dies die savest Weise zu handhaben, zu präsentieren und zu entlassen - auch wenn es manchmal funktioniert entlassen VC1 innerhalb VC1 selbst.
Habe ich gefragt, eine sehr Verwandte Frage, die Sie interessieren könnten, zu prüfen. Es zeigt die code...
ps ich habe auch gelesen, dass einige entlassen, nur VC1 - was wiederum auch entlassen, VC2. Allerdings, wenn meine vorherigen Vorschlag funktioniert, würde ich dies nicht tun. Manchmal bekomme ich Informationen, die während der Ausführung (kein Absturz), dass die VC nicht mehr existiert bzw. alles, was damit zu tun - also bin ich davon ausgegangen, dies ist nicht die beste Lösung. Aber wenn mein prvious Vorschlag nicht funktioniert, können Sie versuchen, die zweite.
Obwohl keine Garantie dafür, dass diese letzten die updates auf neue iOS, da dieses Problem hält hauting mich für mehrere iOS-updates jetzt :-), also habe ich beschlossen zu gehen die standard empfohlene route.
BEARBEITEN:
Dies ist mein modifizierter code - es funktioniert ohne Probleme - aber es ist nicht klar, was Sie beabsichtigen zu geschehen, NACHDEM der Benutzer reponds auf die Warnung, und ob der Alarm sollte auf VC1 oder VC0. Sowieso mit delegieren und Rückrufe, die ich sehe nicht ein Problem. Bitte erläutern Sie, sollte ich verpasst haben, Ihren Standpunkt...
FlightViewControllerProtocol.h
FlightViewController.m
BookmarksTableViewController.h
BookmarksTableViewController.m
Esp den Rückruf in BookmarksTableViewController.m scheint das wichtigste Problem in Ihrer Implementierung, ob ich verstanden Ihre Absichten korrekt.
Sie tun: [self dismissViewControllerAnimated:JA Abschluss: ^{ // hier rufe ich eine Methode in vc1 } in VC2 nicht sth [delegieren dismissVC], in denen diese führen in VC1. Auch versuchen, animation:NEIN - aber bitte stellen Sie sicher, dass Sie nicht entlassen VC2 innerhalb VC1 und entlassen VC1 innerhalb VC0
Warum sollte ich einen Delegaten obwohl? Apple hat mich mit einer Abschluss-block.... Ich werde versuchen, KEINE animation
KEINE animation funktioniert nicht
Ich habe nicht verwendet die Fertigstellung der Blöcke für dieses, da irgendwo habe ich gelesen, dass die Reihenfolge der Ausführung, dh die FERTIGEN entlassen VCs ist nicht garantiert, dass wirklich beendet ist, bevor der code in dem block aufgerufen wird. Wahrscheinlich ist dies auch wahr in Ihrem Fall - außer für die Verwendung von Delegaten ich bin aus Ideen heraus :-(. ps auch versuchen, Ihre app in iOS release-code-version, da diese verhält sich etwas anders aus debug-version code wird schneller ausgeführt und somit bewirkt vermutlich eine andere Reihenfolge der abarbeitung (wie in meinem Fall auch)
InformationsquelleAutor user387184
Tat den trick für mich auch. In meinem Fall hatte ich eine (iPhone) viewController, dass geschoben wurde, auf dem stack mit push-segue. Da der viewController das war die Einleitung der Wechsel hatte eine Navigations-Leiste, ich hatte zu senden, die übergeordnete Steuerung ist der navigationController die popViewControllerAnimated Nachricht, anstatt zu telefonieren, es ist ein eigenes dismissViewControllerAnimated:Nachricht zum Abschluss.
Ray
Ja. Entschuldigung, dass ich verpasst, dass bestimmte Details aus Ihrem ursprünglichen post. Ich habe versucht zu zeigen, dass mit leitet über, können Sie unwissentlich "unter" ein NavigationController, so pop kann die Methode statt entlassen.
InformationsquelleAutor RayInNoIL
Ersten Blick:
Erstens die Einbettung in navigation-controller in der ersten Ansicht.
und diesen code verwenden, navigieren Sie zu einer anderen Ansicht
Zweiten Blick:
Fügen Sie diese Zeile in die Methode zum schließen Ansicht
es gilt als best practice, um ein Objekt zu verwalten, die navigation anstatt manuell verwalten möchten jeden Teil.
InformationsquelleAutor user1573162