Birçok görünümleri olan bir sekme çubuğu uygulaması var. Belirli bir öğenin UIViewController
şu anda içinden görünüp görünmediğini bilmenin bir yolu var mı UIViewController
? (bir mülk arıyor)
Birçok görünümleri olan bir sekme çubuğu uygulaması var. Belirli bir öğenin UIViewController
şu anda içinden görünüp görünmediğini bilmenin bir yolu var mı UIViewController
? (bir mülk arıyor)
Yanıtlar:
Bir görünüm şu anda görünür durumdaysa, görünümün window özelliği sıfır değildir, bu nedenle görünüm denetleyicisindeki ana görünümü kontrol edin:
Görünüm yönteminin çağrılması, görünümün yüklenmesine (yüklenmemişse) gereksizdir ve istenmeyen olabilir. Yüklü olup olmadığını ilk önce kontrol etmek daha iyi olur. Bu sorunu önlemek için isViewLoaded çağrısını ekledim.
if (viewController.isViewLoaded && viewController.view.window) {
// viewController is visible
}
İOS9'dan bu yana kolaylaştı:
if viewController.viewIfLoaded?.window != nil {
// viewController is visible
}
Veya görünüm denetleyicilerini yöneten bir UINavigationController'ınız varsa, bunun yerine visibleViewController özelliğini denetleyebilirsiniz .
topViewController
.
İşte UIViewController
kategori olarak @ progrmr'nin çözümü :
// 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
Yukarıdaki çözümlerle ilgili birkaç sorun var. Örneğin a kullanıyorsanız, UISplitViewController
ana görünüm her zaman için doğru değerine dönecektir.
if(viewController.isViewLoaded && viewController.view.window) {
//Always true for master view in split view controller
}
Bunun yerine, her durumda olmasa da çoğunda iyi işleyen bu basit yaklaşımı kullanın:
- (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;
}
Cevabın Swift 2.2 sürümünü arayanlar için :
if self.isViewLoaded() && (self.view.window != nil) {
// viewController is visible
}
ve Swift 3 :
if self.isViewLoaded && (self.view.window != nil) {
// viewController is visible
}
Tam ekran veya bağlam üstü modsal sunum için "görünür", görünüm denetleyici yığınının üstünde veya yalnızca görünür ancak başka bir görünüm denetleyicisi tarafından kapsanabilir anlamına gelebilir.
Görüntü denetleyicisinin "üstten görünüm denetleyicisi" olup olmadığını "görünür" den oldukça farklı olup olmadığını denetlemek için, görünüm denetleyicisinin gezinme denetleyicisinin görünüm denetleyicisi yığınını denetlemeniz gerekir.
Bu sorunu çözmek için bir parça kod yazdım:
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
}
}
}
isViewLoaded
, Swift 3.0'dan beri bir özelliktir.
UITabBarController
Adlı kullanıcının selectedViewController
özelliğini kullanmak istiyorsunuz . Sekme çubuğu denetleyicisine bağlı tüm görünüm denetleyicilerinin bir tabBarController
özellik kümesi vardır, böylece görünüm denetleyicilerinin kodlarının herhangi birinden şunları yapabilirsiniz:
if([[[self tabBarController] selectedViewController] isEqual:self]){
//we're in the active controller
}else{
//we are not
}
((UINavigationController *)self.tabBarController.selectedViewController).visibleViewController
@ Progrmr'ın cevabına göre hızlı bir eklenti yaptım.
A'nın UIViewController
ekranda olup olmadığını kolayca kontrol etmenizi sağlar :
if someViewController.isOnScreen {
// Do stuff here
}
Uzantı:
//
// UIViewControllerExtension.swift
//
import UIKit
extension UIViewController{
var isOnScreen: Bool{
return self.isViewLoaded() && view.window != nil
}
}
Benim amacım için, bir konteyner görünümü denetleyicisi bağlamında,
- (BOOL)isVisible {
return (self.isViewLoaded && self.view.window && self.parentViewController != nil);
}
iyi çalışıyor.
bir UINavigationController kullanıyorsanız ve aynı zamanda kalıcı görünümleri işlemek istiyorsanız, aşağıdakileri kullanıyorum:
#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
}
Modsal bir görünüm denetleyicisi için kullandığım yaklaşım, sunulan denetleyicinin sınıfını kontrol etmekti. Sunulan görünüm denetleyicisi ViewController2
olsaydı ben bazı kod yürütmek.
UIViewController *vc = [self presentedViewController];
if ([vc isKindOfClass:[ViewController2 class]]) {
NSLog(@"this is VC2");
}
Bu işlevi buldum 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);
Belki yukarıdaki fonksiyonlar ViewController
belirebilir ya da görünmez.
XCode 6.4, iOS 8.4 için, ARC etkin
Açıkçası bunu yapmanın birçok yolu. Benim için çalışan biri ...
@property(nonatomic, readonly, getter=isKeyWindow) BOOL keyWindow
Bu, herhangi bir görünüm denetleyicisinde aşağıdaki şekilde kullanılabilir,
[self.view.window isKeyWindow]
İçinde bu özelliği çağırırsanız -(void)viewDidLoad
0 alırsınız, sonra -(void)viewDidAppear:(BOOL)animated
1'i aldıktan sonra çağırırsanız .
Umarım bu birine yardımcı olur. Teşekkürler! Şerefe.
Bir gezinme denetleyicisi kullanıyorsanız ve yalnızca etkin ve en üstteki denetleyicide olup olmadığınızı öğrenmek istiyorsanız, şunu kullanın:
if navigationController?.topViewController == self {
// Do something
}
Bu cevap @mattdipasquale'nin yorumuna dayanmaktadır .
Daha karmaşık bir senaryonuz varsa, yukarıdaki diğer yanıtlara bakın.
window
mülke göre kontrol edebilirsiniz
if(viewController.view.window){
// view visible
}else{
// no visible
}
Görünüm denetleyicisinin geçerli görüntülenen denetleyici olup olmadığını kontrol etmek için buna ihtiyacım vardı, sunulan herhangi bir görünüm denetleyicisi olup olmadığını kontrol ederek yaptım veya navigatörden itildim, herkes böyle bir çözüme ihtiyaç duyması durumunda gönderiyorum:
if presentedViewController != nil || navigationController?.topViewController != self {
//Viewcontroller isn't viewed
}else{
// Now your viewcontroller is being viewed
}
Bu küçük uzantıyı UIView üyesi olan herhangi bir nesneyi kontrol etmeyi basit ve kolay tutan Swift 5'te kullanıyorum .
extension UIView {
var isVisible: Bool {
guard let _ = self.window else {
return false
}
return true
}
}
Sonra, basit bir if ifadesi kontrolü olarak kullanıyorum ...
if myView.isVisible {
// do something
}
Umut ediyorum bu yardım eder! :)