iOS 7 und ein modalViewController mit segue führt zu Warning: Attempt to present ...

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • iOS 7 und ein modalViewController mit segue führt zu Warning: Attempt to present ...

    Hallo,

    ich denke mir das diese Frage hier sehr einfach ist, aber ich habe es leider nicht geschafft es zu lösen. Habe viel probiert und viel im Netz gesucht, bin aber leider nie auf eine Lösung gekommen.

    Ok jetzt zu meinem Problem. Ich hole mir Daten aus dem Adressbuch und will diese weiter verarbeiten. Die Daten holen ist kein Problem, mein Problem kommt daher das ich einen neuen UITalbeViewController laden muss um meine Daten die ich aus dem Adressbuch erhalten habe weiter zu verarbeiten. Wenn ich nicht eine Person aus dem Adressbuch picke und direkt den Segue aufrufen geht alles, nur wenn ich die Daten aus dem Adressbuch picke kommt immer folgender Fehler:

    Quellcode

    1. ​Warning: Attempt to present <UINavigationController: 0x9fa4510> on <UITabBarController: 0x9f7ebe0> whose view is not in the window hierarchy!


    Hier mein Code wie ich versuche auf meine UITableViewController zuzugreifen.

    Quellcode

    1. -(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {
    2. if (buttonIndex == 0) {
    3. [self performSegueWithIdentifier:@"neuePerson" sender:self];
    4. } else if (buttonIndex == 1) {
    5. [self performSegueWithIdentifier:@"vorhandenePersonen" sender:self];
    6. } else if (buttonIndex == 2) {
    7. ABPeoplePickerNavigationController *picker = [[ABPeoplePickerNavigationController alloc] init];
    8. picker.peoplePickerDelegate = self;
    9. [self presentViewController:picker animated:YES completion:nil];
    10. }
    11. }
    12. -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    13. if([segue.identifier isEqualToString:@"vorhandenePersonen"] && self.tableView.editing == NO) {
    14. AddNewPersonTableViewController *secondController = (id) [segue.destinationViewController topViewController];
    15. secondController.event =self.event;
    16. return;
    17. }
    18. if([segue.identifier isEqualToString:@"neuePerson"] && self.tableView.editing == NO) {
    19. AddNewPersonTableViewController *controller = (id) [segue.destinationViewController topViewController];
    20. controller.person = [JSMCoreDataHelper insertManagedObjectOfClass:[Person class] inManagedObjectContext:[JSMCoreDataHelper managedObjectContext]];
    21. controller.kosten = [JSMCoreDataHelper insertManagedObjectOfClass:[Kosten class] inManagedObjectContext:[JSMCoreDataHelper managedObjectContext]];
    22. controller.personToEdit = NO;
    23. NSMutableSet *personEvent;
    24. if (self.event.person == nil) {
    25. personEvent = [NSMutableSet setWithObjects:controller.person, nil];
    26. } else {
    27. personEvent = [NSMutableSet setWithArray:[self.event.person allObjects]];
    28. [personEvent addObject:controller.person];
    29. }
    30. self.event.person = personEvent;
    31. NSMutableSet *eventPerson;
    32. if (self.event.person == nil) {
    33. eventPerson = [NSMutableSet setWithObjects:self.event, nil];
    34. } else {
    35. eventPerson = [NSMutableSet setWithArray:[controller.person.event allObjects]];
    36. [eventPerson addObject:self.event];
    37. }
    38. controller.person.event = eventPerson;
    39. controller.event = self.event;
    40. return;
    41. }
    42. //Bearbeiten der Datensätze
    43. if([segue.identifier isEqualToString:@"neuePerson"] && self.tableView.editing == YES) {
    44. AddNewPersonTableViewController *controller = (id) [segue.destinationViewController topViewController];
    45. Person *personToEdit = [self.fetchedResultsController objectAtIndexPath:[self.tableView indexPathForSelectedRow]];
    46. controller.person = personToEdit;
    47. controller.personToEdit = YES;
    48. NSPredicate* suchePerson = [NSPredicate predicateWithFormat:@"%K == %@", cEntityKostenRelationshipPerson, personToEdit];
    49. NSPredicate* sucheEvent = [NSPredicate predicateWithFormat:@"%K == %@", cEntityKostenRelationshipEvent, self.event];
    50. NSPredicate *compoundPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:[NSArray arrayWithObjects: suchePerson, sucheEvent, nil]];
    51. for (Kosten* gefundeneKosten in [personToEdit.kosten filteredSetUsingPredicate:compoundPredicate]) {
    52. if (gefundeneKosten) {
    53. controller.kosten = gefundeneKosten;
    54. }
    55. }
    56. controller.event = self.event;
    57. return;
    58. }
    59. if([segue.identifier isEqualToString:@"getPersonFormAddressBook"] && self.tableView.editing == NO) {
    60. // Daten aus dem Adressbuch auslesen
    61. NSString* firstname = (__bridge_transfer NSString*)ABRecordCopyValue(self.personFormAddressBook, kABPersonFirstNameProperty);
    62. NSString* lastname = (__bridge_transfer NSString*)ABRecordCopyValue(self.personFormAddressBook, kABPersonLastNameProperty);
    63. NSString* phone = nil;
    64. ABMultiValueRef phoneNumbers = ABRecordCopyValue(self.personFormAddressBook, kABPersonPhoneProperty);
    65. if (ABMultiValueGetCount(phoneNumbers) > 0) {
    66. phone = (__bridge_transfer NSString*)
    67. ABMultiValueCopyValueAtIndex(phoneNumbers, 0);
    68. } else {
    69. phone = @"[None]";
    70. }
    71. //neue Person erstellen
    72. AddNewPersonTableViewController *controller = (id) [segue.destinationViewController topViewController];
    73. controller.person = [JSMCoreDataHelper insertManagedObjectOfClass:[Person class] inManagedObjectContext:[JSMCoreDataHelper managedObjectContext]];
    74. controller.kosten = [JSMCoreDataHelper insertManagedObjectOfClass:[Kosten class] inManagedObjectContext:[JSMCoreDataHelper managedObjectContext]];
    75. controller.personToEdit = NO;
    76. controller.person.vorname = firstname;
    77. controller.person.nachname = lastname;
    78. NSMutableSet *personEvent;
    79. if (self.event.person == nil) {
    80. personEvent = [NSMutableSet setWithObjects:controller.person, nil];
    81. } else {
    82. personEvent = [NSMutableSet setWithArray:[self.event.person allObjects]];
    83. [personEvent addObject:controller.person];
    84. }
    85. self.event.person = personEvent;
    86. NSMutableSet *eventPerson;
    87. if (self.event.person == nil) {
    88. eventPerson = [NSMutableSet setWithObjects:self.event, nil];
    89. } else {
    90. eventPerson = [NSMutableSet setWithArray:[controller.person.event allObjects]];
    91. [eventPerson addObject:self.event];
    92. }
    93. controller.person.event = eventPerson;
    94. controller.event = self.event;
    95. CFRelease(phoneNumbers);
    96. return;
    97. }
    98. }
    99. #pragma mark - Address Book handling
    100. - (void)peoplePickerNavigationControllerDidCancel:
    101. (ABPeoplePickerNavigationController *)peoplePicker {
    102. [self dismissViewControllerAnimated:YES completion:nil];
    103. }
    104. - (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person {
    105. self.personFormAddressBook = person;
    106. [self performSegueWithIdentifier:@"getPersonFormAddressBook" sender:self];
    107. //[self displayPerson:person];
    108. [self dismissViewControllerAnimated:YES completion:nil];
    109. return NO;
    110. }
    111. - (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier {
    112. return NO;
    113. }
    Alles anzeigen


    Ich hoffe das einer von euch meinen Fehler findet und mir sagen kann was ich falsch mache.

    Danke

    Gruß

    Bongartz
    Vielen Dank

    Gruß

    Bongartz
  • Hallo,

    sorry das habe ich ja glatt vergessen mit anzugeben ;)

    Der Fehler tritt auf wenn ich beim ActionSheet auf den Button mit dem Tag 2 drücke. Dann wird dieser Code ausgeführt:

    Quellcode

    1. ​ABPeoplePickerNavigationController *picker = [[ABPeoplePickerNavigationController alloc] init];
    2. picker.peoplePickerDelegate = self;
    3. [self presentViewController:picker animated:YES completion:nil];


    Ja in der App gibt es auch einen TabBarController, dies wieder aber nicht bei dieser Methode angesprochen.
    Vielen Dank

    Gruß

    Bongartz
  • So habe die Fehler gefunden. Ich hatte den neuen MadalViewController geladen und den alten von dem Adressbuch Picket versucht zu löschen. Was natürlich sau blöde ist.

    Zu dem muss man den Aufruf des segue in einer Blockanweisung ausführen, ncah dem der ModalViewController vom Picket entfernt wurde.

    Quellcode

    1. - (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person {
    2. self.personFormAddressBook = person;
    3. [self dismissViewControllerAnimated:YES completion:^{
    4. [self performSegueWithIdentifier:@"getPersonFormAddressBook" sender:self];
    5. }];
    6. return NO;
    7. }
    Alles anzeigen
    Vielen Dank

    Gruß

    Bongartz
  • Ich mag mich hier mal einklinken, selbes Problem.
    2014-09-09 11:25:21.232 app[479:60b] Warning: Attempt to present <MFSOutroViewController: 0x166f4fb0> on <UINavigationController: 0x16556c50> whose view is not in the window hierarchy!


    Ja, mag sein.
    Das Ganze ist eine Ansammlung von einzelnen Views in einem NavigationController.
    An einem bestimmten Punkt im Code möchte ich nun einen bestimmten View Controller aus dem Storyboard anzeigen.
    Dieser bestimmte Punkt ist ein berechneter Zeitpunkt ohne direkte User Interaktion.

    Man kann sich den Ablauf ungefähr so vorstellen:
    Der User wählt vier Bilder aus der Galerie, um daraus ein MeshUp zu erstellen.
    Jetzt möchte ich eben nicht einen Button aktivieren müssen, auf den der User klickt worauf hin dann das zermanschte Bild aus den vier Quellen errechnet wird.
    Ich möchte, dass nach der Auswahl des vierten Images automatisch in den View Controller gewechselt wird, der dann das Bild zermanscht.

    Prinzipiell ja auch kein Problem – wäre da nicht der UINavigationController.

    Quellcode

    1. - (void) navigateFurther {
    2. if([self allImagesTaken]) {
    3. UIViewController * resultsViewController = [[self storyboard] instantiateViewControllerWithIdentifier:@"ComputedResultsVC"];
    4. [self presentViewController:thankYouViewController animated:NO completion:nil];
    5. }
    6. }


    Ich verstehe die Sachlage wie folgt:
    Der aufzurufende View Controller hat absolut keine Verbindung zum NavigationViewController. Besagter NavigationViewController findet das doof, weil er irgend eine Verbindung zur Viewhierarchie aufbauen muss, um meinem Anzeigewunsch zu entsprechen.

    Ich verstehe aber nicht, wie ich das Problem beheben kann.
    Soweit ich eine Seque verstehe, kann ich diese im Storyboard nur von einem Startpunkt zu einem Endpunkt ziehen. Allerdings habe ich keinen Startpunkt, da dies kein Ort im UI sondern ein Zeitpunkt in der Benutzung ist.

    Insofern die Frage:
    Wie blende ich (irgend) einen ViewController in einer Storyboard-basierten App programmatisch an beliebiger Stelle im Code so ein, dass er mir angezeigt wird?
    (Wenn ich den UINavigationController los würde, wäre das auch okay. Er ist allerdings 'leider' auch der RootViewController.)
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P