160 Stimmen

Wie überprüft man, ob ein Ansichts-Controller modal präsentiert oder auf einem Navigations-Stack verschoben wurde?

Wie kann ich in meinem Ansichtscontrollercode zwischen folgenden Punkten unterscheiden:

  • modal präsentiert
  • auf dem Navigationsstapel verschoben

Sowohl presentingViewController als auch isMovingToParentViewController sind in beiden Fällen YES, daher nicht sehr hilfreich.

Was die Dinge kompliziert macht, ist, dass mein Elternansichtscontroller manchmal modal ist, auf dem der zu überprüfende Ansichtscontroller verschoben wird.

Es stellt sich heraus, mein Problem ist, dass ich meinen HtmlViewController in einem UINavigationController einbetten, der dann präsentiert wird. Deshalb haben meine eigenen Versuche und die guten Antworten unten nicht funktioniert.

HtmlViewController*     termsViewController = [[HtmlViewController alloc] initWithDictionary:dictionary];
UINavigationController* modalViewController;

modalViewController = [[UINavigationController alloc] initWithRootViewController:termsViewController];
modalViewController.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
[self presentViewController:modalViewController
                   animated:YES
                 completion:nil];

Ich denke, ich sollte meinem Ansichtscontroller besser mitteilen, wenn er modal ist, anstatt zu versuchen, es zu bestimmen.

2voto

Shahbaz Abbasi Punkte 21

Wenn Sie iOS 5.0 oder höher verwenden, verwenden Sie bitte diesen Code

-(BOOL)isPresented
{
    if ([self isBeingPresented]) {
        // präsentiert wird
         return YES;
    } else if ([self isMovingToParentViewController]) {
        // wird verschoben
         return NO;
    } else {
        // wird einfach wieder angezeigt, weil ein anderer VC abgelehnt wurde
         return NO;
    }
}

2voto

Arash Zeinoddini Punkte 801

Um festzustellen, ob Ihr Controller gedrückt wurde oder nicht, verwenden Sie einfach den folgenden Code an beliebiger Stelle:

if ([[[self.parentViewController childViewControllers] firstObject] isKindOfClass:[self class]]) {

    // Nicht gedrückt
}
else {

    // Gedrückt
}

Ich hoffe, dieser Code kann jemandem helfen...

1voto

mkto Punkte 4393
if let navigationController = self.navigationController, navigationController.isBeingPresented {
    // wird präsentiert
} else {
    // wird verschoben
}

0voto

blackjacx Punkte 7220

Was ist mit dieser Lösung - getestet unter iOS 15 und Xcode 13.1:

var isPresented: Bool {
    if let nvc = navigationController {
        return nvc.viewControllers.firstIndex(of: self) == 0
    } else {
        return presentingViewController != nil
    }
}

0voto

Saif Punkte 2248

Für jemanden, der sich fragt, wie man ViewController mitteilt, dass er präsentiert wird

wenn A B präsentiert/pusht

  1. Definieren Sie ein enum und eine property in B

    enum ViewPresentationStyle {
        case Push
        case Present
    }
    
    //und schreiben Sie die Eigenschaft
    
    var vcPresentationStyle : ViewPresentationStyle = .Push //Standardwert, unter der Annahme, dass B gepusht wird
  2. Jetzt im A View Controller, sagen Sie B, ob es präsentiert/pusht wird, indem Sie presentationStyle zuweisen

    func presentBViewController() {
        let bViewController = B()
        bViewController.vcPresentationStyle = .Present //teilt B mit, dass es präsentiert wird
        self.presentViewController(bViewController, animated: true, completion: nil)
    }
  3. Verwendung im B View Controller

    override func viewDidLoad() {
        super.viewDidLoad()
    
        if self.vcPresentationStyle == .Present {
            //wird präsentiert 
        }
        else {
            //wird gepusht
        }
    
    }

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