640 Stimmen

Wie man feststellt, ob die Ansicht des UIViewControllers sichtbar ist

Ich habe eine Registerkartenanwendung mit vielen Ansichten. Gibt es eine Möglichkeit zu wissen, ob eine bestimmte UIViewController ist derzeit von der Website aus sichtbar UIViewController ? (auf der Suche nach einer Immobilie)

0 Stimmen

1220voto

progrmr Punkte 73486

Die Aussicht ist Fenstereigenschaft ist nicht null, wenn ein View gerade sichtbar ist, also prüfen Sie den Haupt-View im View-Controller:

Aufrufen der siehe Methode bewirkt, dass die Ansicht geladen wird (wenn sie nicht geladen ist), was unnötig ist und unerwünscht sein kann. Es wäre besser, zuerst zu prüfen, ob sie bereits geladen ist. Ich habe den Aufruf von isViewLoaded hinzugefügt, um dieses Problem zu vermeiden.

if (viewController.isViewLoaded && viewController.view.window) {
    // viewController is visible
}

Seit iOS9 ist es einfacher geworden:

if viewController.viewIfLoaded?.window != nil {
    // viewController is visible
}

Oder wenn Sie einen UINavigationController haben, der die View-Controller verwaltet, könnten Sie dessen visibleViewController Eigenschaft.

14 Stimmen

Das einzige Problem mit der visibleViewControllee-Eigenschaft eines UINavigationControllers ist der Fall, dass Ihr visibleViewController einen modalen View-Controller darstellt. In diesem Fall wird die modale Ansicht der visibleViewController, was unerwünscht sein kann. Wie würden Sie das handhaben?

13 Stimmen

Dies ist wahrscheinlich für jeden offensichtlich, aber für mich musste der Code self.isViewLoaded && self.view.window sein

0 Stimmen

Beachten Sie, dass in iOS 7 ein Navigationscontroller nicht sofort einen Push-View-Controller in den Speicher lädt. Dies ist ein Unterschied zu iOS 6, wo man einen View-Controller pushen konnte und sofort sehen konnte, dass navController.topViewController.isViewLoaded wahr war.

91voto

ma11hew28 Punkte 112879

Hier ist die Lösung von @progrmr als UIViewController Kategorie:

// UIViewController+Additions.h

@interface UIViewController (Additions)

- (BOOL)isVisible;

@end

// UIViewController+Additions.m

#import "UIViewController+Additions.h"

@implementation UIViewController (Additions)

- (BOOL)isVisible {
    return [self isViewLoaded] && self.view.window;
}

@end

57voto

vincentjames501 Punkte 2091

Bei den oben genannten Lösungen gibt es einige Probleme. Wenn Sie zum Beispiel eine UISplitViewController wird die Master-Ansicht immer true zurückgeben für

if(viewController.isViewLoaded && viewController.view.window) {
    //Always true for master view in split view controller
}

Stattdessen sollten Sie diesen einfachen Ansatz wählen, der in den meisten, wenn nicht sogar in allen Fällen gut zu funktionieren scheint:

- (void)viewDidDisappear:(BOOL)animated {
    [super viewDidDisappear:animated];

    //We are now invisible
    self.visible = false;
}

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];

    //We are now visible
    self.visible = true;
}

1 Stimmen

Ist dies immer noch wahr in xCode 7.1.1? Der Master in meinem UISplitViewController gibt NO für viewController.view.window zurück. Ich kann etwas falsch machen, aber ich bin ziemlich sicher, dass dies der Fall ist.

46voto

Benjamin Punkte 7928

Für diejenigen unter Ihnen, die nach einem Swift 2.2 Version der Antwort:

if self.isViewLoaded() && (self.view.window != nil) {
     // viewController is visible
}

y Mauersegler 3 :

if self.isViewLoaded && (self.view.window != nil) {
         // viewController is visible
}

0 Stimmen

Ich bin mir nicht sicher, warum, aber ich habe festgestellt, dass self.view.window != nil dazu führt, dass es nie funktioniert, selbst wenn self.isViewLoaded wahr ist. Einmal entfernt, funktioniert es gut.

1 Stimmen

Dies funktionierte bei mir nur bei viewDidAppear. Wenn ich dies zu viewWillAppear self.view.window != nil hinzugefügt habe, kam immer nil heraus

35voto

WeZZard Punkte 3487

Bei der modalen Darstellung über den gesamten Bildschirm oder über den Kontext hinaus kann "ist sichtbar" bedeuten, dass sie oben auf dem Stapel der View-Controller liegt oder nur sichtbar ist, aber von einem anderen View-Controller verdeckt wird.

Um zu überprüfen, ob der View-Controller "is the top view controller" sich von "is visible" unterscheidet, sollten Sie den View-Controller-Stapel des Navigations-Controllers des View-Controllers überprüfen.

Ich habe ein Stück Code geschrieben, um dieses Problem zu lösen:

extension UIViewController {
    public var isVisible: Bool {
        if isViewLoaded {
            return view.window != nil
        }
        return false
    }

    public var isTopViewController: Bool {
        if self.navigationController != nil {
            return self.navigationController?.visibleViewController === self
        } else if self.tabBarController != nil {
            return self.tabBarController?.selectedViewController == self && self.presentedViewController == nil
        } else {
            return self.presentedViewController == nil && self.isVisible
        }
    }
}

0 Stimmen

Schöner Beitrag! ZU IHRER INFORMATION: isViewLoaded ist eine Eigenschaft seit Swift 3.0.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X