2015-12-20 2 views
8

Ich habe eine Multi-View-Anwendung mit der folgenden Hierarchie darzustellen:Attempt eine UIViewController deren Ansicht ist, nicht in der Fensterhierarchie

splash -> Navigationssteuerung -> Tabelle View-Controller -> Einstellungen View Controller

Splash ist der Eingangspunkt der Anwendung und wird daher zum Stammansicht-Controller. Wenn ich versuche, eine Kachel an die Band über eine Aktion auf den Einstellungen Controller anzuzeigen hinzuzufügen, erhalte ich eine Debugger Warnung:

Anwendung [1929: 1.000.746] Warnung: Versuch < MSBAddTileDialogViewController_iOS vorstellen: 0x15f0575b0 > auf < SplashViewController : 0x15dd597b0 > dessen Ansicht nicht in der Fensterhierarchie ist!

Dies geschieht unmittelbar nach dem Anruf an MSBClient.tileManager addTile:completionHandler:. Der Aufruf wird nie zurückgegeben, es wird kein Fehler generiert.

Irgendwelche Vorschläge, wie Sie das umgehen können?

+1

Ich arbeite nur mit der iOS-Entwicklung, daher kann ich Ihre Frage wahrscheinlich nicht direkt beantworten. Wenn Sie ein Tile mithilfe des Band SDK hinzufügen, wird versucht, dem Benutzer einen Bestätigungsdialog anzuzeigen. Es kann sein, dass Ihr Controller-Stack nicht gut damit übereinstimmt, wie das Band SDK den richtigen Controller findet, dem ein eigener View-Controller hinzugefügt werden soll. Möglicherweise müssen Sie weitere Snippets Ihres Einstellungsansicht-Controllers bereitstellen, um zu sehen, wie/wann in seinem Lade-/Anzeigeprozess versucht wird, die Kachel hinzuzufügen. –

+0

@ phil-hoff-msft, danke fürs anschauen. Hier ist [ein Beispiel] (http://mikeradin.com/ModifiedBandTileEvent.zip). Ich habe das mit dem iOS SDK-Download enthaltene Beispiel so geändert, dass eine Zwischenansicht hinzugefügt wurde, die die Benutzeroberfläche nicht zum Stammansicht-Controller macht. Das gleiche Problem existiert. – chortik

+0

Dies ist ein bekanntes Problem, da das SDK versucht, das Bestätigungsdialogfeld auf dem Stammansicht-Controller anzuzeigen, auch wenn es nicht Teil der Ansichtshierarchie ist. Die einzige Problemumgehung für den Moment besteht darin, sicherzustellen, dass der Root-View-Controller beim Aufruf von addTile: angezeigt wird. –

Antwort

0

Sie müssen den Root-View-Controller abrufen und einen Übergang von diesem View-Controller ausführen. Das kann ziemlich frustrierend sein, aber es gibt einige Antworten hier auf dieses Thema.

Hier ist ein Code, den ich verwendet habe, um einen Übergang vom Root-View-Controller zu einem Bildschirm durchzuführen, wenn die App eine Push-Benachrichtigung erhält.

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"YourStoryboard" bundle:nil]; 

YourViewController *viewController = [storyboard instantiateViewControllerWithIdentifier:@"viewcontrolleridentifier"]; 

UIViewController *top = [UIApplication sharedApplication].keyWindow.rootViewController; 

[top presentViewController:viewController animated:YES completion: nil]; 

Heres der gleiche Code in swift:

let storyboard = UIStoryboard.init(name: "YourStoryboard", bundle: nil) 

let viewController = storyboard.instantiateViewController(withIdentifier: "viewcontrolleridentifier") 

let top = UIApplication.shared.keyWindow?.rootViewController 

top?.present(viewController, animated: true, completion: nil) 

Stellen Sie sicher, dass Sie die Ansicht-Controller-Kennung in Ihrem Storyboard festgelegt.

EDIT * Wenn die View-Controller Sie innerhalb einer Navigationssteuerung eingebettet zugreifen werden Sie den obigen Code ändern müssen,

Objective C:

UIViewController *top = [self topMostController]; 

UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:viewController]; 

[top presentViewController:navigationController animated:YES completion: nil]; 

Swift:

let top = UIApplication.shared.keyWindow?.rootViewController 

let navigationController = UINavigationController.init(rootViewController: viewController) 

top?.present(navigationController, animated: true, completion: nil)