Frage

Ich mache eine iPad -App, die auf einem UiSplitViewController basiert. Ich habe ein kleines Problem mit der Taste Toobar, als meine App in Potrait gestartet wurde. Die Schaltfläche zum Anzeigen des Popovers wird nicht angezeigt. Wenn ich jedoch mein iPad in Landschaft und dann zurück zum Porträt drehte, zeigt der Knopf!

Es sieht so aus, als ob die folgende Methode nicht beim Start aufgerufen wird (dies war, wenn der Code die Schaltfläche zeigt):

- (void)splitViewController:(UISplitViewController *)svc willHideViewController:(UIViewController *)aViewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController: (UIPopoverController *)pc

Diese Methode wird nicht aufgerufen, wenn die App startet, sondern nur, wenn eine Rotation vorliegt. Was noch fremd ist, ist, dass ich eine Test -App mit Xcode uiSplitViewController -Vorlage + Core -Daten erstellt habe (die der App, an der ich arbeite, ähnlich ist, und die Vorlage, die ich für diese App verwendet habe). In der Test -App, auf der ich keine einzige Codezeile erstellt habe, zeigt die Schaltfläche, wenn ich meine App im Porträtmodus starte, und die obige Methode wird ebenfalls zum Start aufgerufen, im Gegensatz zu meiner anderen App. Hat jemand ein ähnliches Problem?

Schließlich geht es aus der Apple -Dokumentation nicht sehr klar, ob diese Methode aufgerufen werden soll, wenn ein UiSplitViewController zum ersten Mal gezeigt wird:http://developer.apple.com/library/ios/#documentation/uikit/reference/uisplitviewcontrollerdelegate_protocol/reference/referenferse.html%23/apple_ref/doc/uid/tp40009454

War es hilfreich?

Lösung

"Kshitiz" hat das richtige Konzept. Zuerst habe ich das self.splitviewController.delegate = self in der ViewDidload -Methode festgelegt, die es etwas zu spät ist, diese Delegation festzulegen. Also habe ich versucht, die Delegation in früherer Stufe festzulegen, die von der Methode wach. Dann funktioniert es gut.

Das Problem ist also nach der Ansicht, die bereits durch ViewDIdload geladen wurde, und die Delegation funktioniert nicht, es funktioniert einige Zeit nach einigen Aktivitäten (z. B. das iPad drehen). Die frühere Stufe als ViewDidload ist also wachfromnib.

Hier ist der Code, der funktioniert:

- (void) awakeFromNib{
    [super awakeFromNib];
    self.splitViewController.delegate = self;
}

Andere Tipps

Haben Sie einen SplitViewController -Delegierten festgelegt? Im Allgemeinen tritt das Problem auf, wenn der Delegierter nicht festgelegt ist.

Ich hatte genau das gleiche Problem und Martin Gunnarssons Antwort führte mich zur Lösung.

Früher habe ich die Delegate -Eigenschaft des UiSplitViewController festgelegt, nachdem die Delegieransicht (die Detailansicht) bereits geladen worden war, in viewDidLoad:. Zu diesem Zeitpunkt hatte der UiSplitViewController die Anfangsanlage bereits gesendet splitViewController:willHideViewController:withBarButtonItem:forPopoverController: Botschaft. Ich hatte den Delegierten einfach nicht früh genug gesetzt.

Die Lösung bestand darin, den Delegierten im Haupt -App -Delegierten zuzuweisen, in application:DidFinishLaunchingWithOptions:. In diesem Fall war mein Delegierter in einem Navigationscontroller enthalten, also musste ich eine Schicht tiefer graben, um ihn zu bekommen.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    UISplitViewController *splitViewController = (UISplitViewController *)self.window.rootViewController;
    UINavigationController *mainNavigationController = (UINavigationController *)[splitViewController.viewControllers objectAtIndex:1];
    HPMainViewController *mainViewController = [mainNavigationController.viewControllers objectAtIndex:0]; 

    splitViewController.delegate = mainViewController;
    return YES;
}

Dies hat mich auch ersatztet, je mehr, seit ich an zwei iPad-Projekten mit außerhalb des Box SplitViewController arbeite und der erste zeigt immer die Schaltfläche "Master", während der zweite nie getan hat. Ich habe Outlets und Beziehungen und Delegierte verglichen, bis ich mit kreuzenden Augen war, aber schließlich die Antwort im AppDelegate fand. Es stellte sich heraus, dass ich in der Anwendung ein bisschen zu viel kommentiert hatte: didfinishlaunchingwithoptions: speziell dort, wo der SplitViewController.delegate festgelegt wurde.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
        UISplitViewController *splitViewController = (UISplitViewController *)self.window.rootViewController;
        UINavigationController *navigationController = [splitViewController.viewControllers lastObject];
        splitViewController.delegate = (id)navigationController.topViewController;
    }

Wenn Sie dies dem AppDelegate hinzufügen, müssen Sie den SplitViewController subklassen. Ich habe auch versucht, den Delegierten in IB zu verbinden, aber aus irgendeinem Grund hätte es nichts davon. Storyboard Design Fehler, Imho.

Ich war ziemlich einiger Zeit damit festgefahren. Endlich zum Laufen gebracht. Der Wachfomnib hat bei mir nicht funktioniert. Die Didfinishlaunchingwithoptions tat es. Könnte daran liegen, dass ich eine Abfrage ausführe, die die Elemente im Popover -Controller bevölkert.

Ich habe das gleiche Problem. Meine Ansicht ist in IB eingerichtet, und es scheint, dass dies ein Timing -Problem ist. Der Delegierte der Split -View wird festgelegt, nachdem die Split -Ansicht über die anfängliche Ausrichtung "Änderung" informiert hat. Durch das Hinzufügen der Split -Ansicht zu einem Outlet in der App -Delegate wurde die Schaltfläche beim Porträtstart für mich angezeigt, aber wenn ich das Popup öffne, ist es leer. Dies kann wahrscheinlich irgendwie herumgearbeitet werden, aber ich denke, es ist seltsam, dass die Split -Ansicht ihren Delegierten nicht über die aktuelle Ausrichtung benachrichtigt, wenn sie festgelegt ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top