ios - forgot - mesmo id apple em dois iphones




Como saber se a visualização de UIViewController é visível (10)

Eu tenho um aplicativo de barra de abas, com muitas visualizações. Existe uma maneira de saber se um determinado UIViewController está atualmente visível a partir do UIViewController ? (procurando por uma propriedade)


A propriedade da janela da visualização não é nula se uma visualização estiver atualmente visível, portanto, verifique a visualização principal no controlador de visualização:

[EDITAR] Invocar o método de view faz com que a exibição seja carregada (se não estiver carregada), o que é desnecessário e pode ser indesejável. Seria melhor verificar primeiro se já está carregado. Eu adicionei a chamada para isViewLoaded para evitar esse problema.

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

Ou, se você tiver um UINavigationController gerenciando os view controllers, poderá verificar sua propriedade visibleViewController .

Além disso, no Swift no iOS 9 (ou posterior):

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

A abordagem que eu usei para um controlador de visualização apresentado modal foi verificar a classe do controlador apresentado. Se o controlador de visualização apresentado fosse ViewController2 , eu executaria algum código.

UIViewController *vc = [self presentedViewController];

if ([vc isKindOfClass:[ViewController2 class]]) {
    NSLog(@"this is VC2");
}

Eu encontrei essas funções no UIViewController.h .

/*
  These four methods can be used in a view controller's appearance callbacks to determine if it is being
  presented, dismissed, or added or removed as a child view controller. For example, a view controller can
  check if it is disappearing because it was dismissed or popped by asking itself in its viewWillDisappear:
  method by checking the expression ([self isBeingDismissed] || [self isMovingFromParentViewController]).
*/

- (BOOL)isBeingPresented NS_AVAILABLE_IOS(5_0);
- (BOOL)isBeingDismissed NS_AVAILABLE_IOS(5_0);

- (BOOL)isMovingToParentViewController NS_AVAILABLE_IOS(5_0);
- (BOOL)isMovingFromParentViewController NS_AVAILABLE_IOS(5_0);

Talvez as funções acima possam detectar que o ViewController está aparecendo ou não.


Eu precisava disso para verificar se o controlador de visualização é o controlador visualizado atual, eu fiz isso verificando se há algum controlador de exibição apresentado ou empurrado através do navegador, estou postando no caso de alguém precisar de tal solução:

if presentedViewController != nil || navigationController?.topViewController != self {
      //Viewcontroller isn't viewed
}else{
     // Now your viewcontroller is being viewed 
}

Fiz uma extensão rápida com base na resposta do @progmr.

Ele permite que você verifique facilmente se um UIViewController está na tela da seguinte forma:

if someViewController.isOnScreen {
    // Do stuff here
}

A extensão:

//
//  UIViewControllerExtension.swift
//

import UIKit

extension UIViewController{
    var isOnScreen: Bool{
        return self.isViewLoaded() && view.window != nil
    }
}

Para apresentação modal em tela cheia ou em excesso de contexto, "visível" pode significar que ela está no topo da pilha do controlador de visualização ou apenas visível, mas coberta por outro controlador de visualização.

Para verificar se o controlador de visualização "é o controlador de vista superior" é bastante diferente de "visível", deve verificar a pilha do controlador de visualização do controlador de navegação do controlador de visualização.

Eu escrevi um pedaço de código para resolver este problema:

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
        }
    }
}

Para os meus propósitos, no contexto de um controlador de exibição de contêiner, descobri que

- (BOOL)isVisible {
    return (self.isViewLoaded && self.view.window && self.parentViewController != nil);
}

funciona bem.


Se você estiver usando um UINavigationController e também quiser manipular modos de exibição modais, o seguinte é o que eu uso:

#import <objc/runtime.h>

UIViewController* topMostController = self.navigationController.visibleViewController;
if([[NSString stringWithFormat:@"%s", class_getName([topMostController class])] isEqualToString:@"NAME_OF_CONTROLLER_YOURE_CHECKING_IN"]) {
    //is topmost visible view controller
}

Você deseja usar a propriedade selectedViewController do UITabBarController . Todos os controladores de visualização anexados a um controlador de barra de guias possuem um conjunto de propriedades tabBarController , portanto, você pode, dentro de qualquer código de controle de visualização:

if([[[self tabBarController] selectedViewController] isEqual:self]){
     //we're in the active controller
}else{
     //we are not
}

XCode 6.4, para iOS 8.4, ARC ativado

Obviamente, muitas maneiras de fazer isso. O que funcionou para mim é o seguinte ...

@property(nonatomic, readonly, getter=isKeyWindow) BOOL keyWindow

Isso pode ser usado em qualquer controlador de exibição da seguinte maneira,

[self.view.window isKeyWindow]

Se você chamar esta propriedade em -(void)viewDidLoad você recebe 0, então se você chamar isto depois -(void)viewDidAppear:(BOOL)animated você recebe 1.

Espero que isso ajude alguém. Obrigado! Felicidades.





uiviewcontroller