উত্তর:
দৃশ্য এর জানালা সম্পত্তি অ শূন্য যদি একটি দৃশ্য বর্তমানে দৃশ্যমান, তাই দৃশ্য নিয়ামক প্রধান দৃশ্য চেক করুন:
Invoking দৃশ্য পদ্ধতি লোড দৃশ্য (যদি এটি লোড করা হয়নি) যা অপ্রয়োজনীয় ও অনাকর্ষণীয় হতে পারে কারণ। এটি ইতিমধ্যে লোড হয়েছে কিনা তা আগে দেখার জন্য আরও ভাল হবে। এই সমস্যাটি এড়াতে আমি কলটি ভিউলয়েডে যুক্ত করেছি।
if (viewController.isViewLoaded && viewController.view.window) {
// viewController is visible
}
IOS9 সাল থেকে এটি আরও সহজ হয়ে গেছে:
if viewController.viewIfLoaded?.window != nil {
// viewController is visible
}
অথবা যদি আপনার কাছে কোনও ইউআইএনএভিগেশন কন্ট্রোলার দর্শন নিয়ন্ত্রকদের পরিচালনা করে থাকে তবে আপনি এর পরিবর্তে দৃশ্যমান ভিউকন্ট্রোলার সম্পত্তিটি পরীক্ষা করতে পারেন ।
topViewController
।
এখানে UIViewController
বিভাগ হিসাবে @ প্রোগ্রামার এর সমাধান :
// 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
উপরোক্ত সমাধানগুলি নিয়ে কয়েকটি সমস্যা রয়েছে। উদাহরণস্বরূপ, আপনি যদি ব্যবহার করেন UISplitViewController
তবে মাস্টার ভিউ সর্বদা এর জন্য সত্য হবে
if(viewController.isViewLoaded && viewController.view.window) {
//Always true for master view in split view controller
}
পরিবর্তে, এই সহজ পদ্ধতিটি গ্রহণ করুন যা বেশিরভাগ ক্ষেত্রে ভালভাবে কাজ করে বলে মনে হয়, যদি সমস্ত ক্ষেত্রে না হয়:
- (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;
}
আপনারা যারা উত্তরের স্যুইফ্ট ২.২ সংস্করণটি সন্ধান করছেন তাদের জন্য :
if self.isViewLoaded() && (self.view.window != nil) {
// viewController is visible
}
এবং সুইফট 3 :
if self.isViewLoaded && (self.view.window != nil) {
// viewController is visible
}
ওভার-পূর্ণ-স্ক্রিন বা ওভার-প্রসঙ্গের মডেল উপস্থাপনার জন্য, "দৃশ্যমান" এর অর্থ এটি ভিউ কন্ট্রোলার স্ট্যাকের শীর্ষে বা কেবল দৃশ্যমান তবে অন্য ভিউ নিয়ামক দ্বারা আবৃত।
ভিউ কন্ট্রোলারটি "শীর্ষ দর্শনের নিয়ামক" কিনা "দৃশ্যমান" থেকে একেবারে আলাদা কিনা তা পরীক্ষা করতে আপনার ভিউ কন্ট্রোলারের নেভিগেশন নিয়ন্ত্রকের ভিউ কন্ট্রোলার স্ট্যাকটি পরীক্ষা করা উচিত।
এই সমস্যাটি সমাধান করার জন্য আমি কোডের একটি অংশ লিখেছি:
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
হ'ল সুইফট ৩.০ থেকে সম্পত্তি।
আপনি UITabBarController
এর selectedViewController
সম্পত্তি ব্যবহার করতে চান । কোনও ট্যাব বার নিয়ামকের সাথে সংযুক্ত সমস্ত দর্শনীয় কন্ট্রোলারের একটি tabBarController
সম্পত্তি সেট থাকে, যাতে আপনি যে কোনও ভিউ কন্ট্রোলারের কোডের মধ্যে থেকেই পারেন:
if([[[self tabBarController] selectedViewController] isEqual:self]){
//we're in the active controller
}else{
//we are not
}
((UINavigationController *)self.tabBarController.selectedViewController).visibleViewController
আমি @ প্রোগ্রামার এর উত্তরের উপর ভিত্তি করে একটি দ্রুত এক্সটেনশন করেছি।
এটি আপনাকে সহজে UIViewController
স্ক্রিনে আছে কিনা তা পরীক্ষা করতে দেয় :
if someViewController.isOnScreen {
// Do stuff here
}
প্রসার:
//
// UIViewControllerExtension.swift
//
import UIKit
extension UIViewController{
var isOnScreen: Bool{
return self.isViewLoaded() && view.window != nil
}
}
আমার উদ্দেশ্যে, একটি ধারক দর্শন নিয়ন্ত্রকের প্রসঙ্গে, আমি এটি খুঁজে পেয়েছি
- (BOOL)isVisible {
return (self.isViewLoaded && self.view.window && self.parentViewController != nil);
}
ভাল কাজ করে.
আপনি যদি কোনও ইউআইএনএভিগেশন কন্ট্রোলার ব্যবহার করে থাকেন এবং মডেল ভিউগুলিও পরিচালনা করতে চান তবে নীচেরটি আমি ব্যবহার করি:
#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
}
আমি মডেল উপস্থাপিত ভিউ কন্ট্রোলারের জন্য যে পদ্ধতির ব্যবহার করেছি তা হ'ল উপস্থাপিত নিয়ামকের শ্রেণি পরীক্ষা করা। যদি উপস্থাপিত ভিউ কন্ট্রোলার হয় ViewController2
তবে আমি কিছু কোড সম্পাদন করব।
UIViewController *vc = [self presentedViewController];
if ([vc isKindOfClass:[ViewController2 class]]) {
NSLog(@"this is VC2");
}
আমি এই ফাংশন খুঁজে পেয়েছি 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);
সম্ভবত উপরের ফাংশনগুলি সনাক্ত হয়েছে কিনা ViewController
তা সনাক্ত করতে পারে ।
আইওএস 8.4 এর জন্য এক্সকোড 6.4, আরসি সক্ষম করেছে
স্পষ্টতই এটি করার প্রচুর উপায়। আমার জন্য যে কাজ করেছে সে হ'ল নিম্নলিখিত ...
@property(nonatomic, readonly, getter=isKeyWindow) BOOL keyWindow
এটি নিম্নলিখিত উপায়ে যে কোনও ভিউ কন্ট্রোলারে ব্যবহার করা যেতে পারে,
[self.view.window isKeyWindow]
আপনি যদি এই সম্পত্তিটিতে কল করেন -(void)viewDidLoad
তবে 0 পাবেন, যদি আপনি -(void)viewDidAppear:(BOOL)animated
1 পাওয়ার পরে এই কল করেন ।
আশা করি এটি কাউকে সাহায্য করবে। ধন্যবাদ! চিয়ার্স।
আপনি যদি নেভিগেশন নিয়ামক ব্যবহার করে থাকেন এবং কেবল সক্রিয় এবং শীর্ষস্থানীয় নিয়ামক হিসাবে রয়েছেন তা জানতে চান , তবে ব্যবহার করুন:
if navigationController?.topViewController == self {
// Do something
}
এই উত্তরটি @ মেটডিপাস্কোলে'র মন্তব্যের ভিত্তিতে তৈরি ।
আপনার যদি আরও জটিল পরিস্থিতি থাকে তবে উপরের অন্যান্য উত্তরগুলি দেখুন।
আপনি window
সম্পত্তি দ্বারা এটি পরীক্ষা করতে পারেন
if(viewController.view.window){
// view visible
}else{
// no visible
}
ভিউ কন্ট্রোলারটি এখনকার দেখা নিয়ন্ত্রক কিনা তা খতিয়ে দেখার জন্য আমার এটি দরকার ছিল, আমি কোনও উপস্থাপিত ভিউ কন্ট্রোলার আছে কিনা বা নেভিগেটরের মাধ্যমে ধাক্কা দিয়েছে কিনা তা যাচাইয়ের মাধ্যমে করেছি, কারও কাছে যদি এরকম সমাধানের প্রয়োজন হয় তবে আমি এটি পোস্ট করছি:
if presentedViewController != nil || navigationController?.topViewController != self {
//Viewcontroller isn't viewed
}else{
// Now your viewcontroller is being viewed
}
আমি সুইফট 5 এ এই ছোট এক্সটেনশনটি ব্যবহার করি , যা ইউআইভিউয়ের সদস্য যে কোনও অবজেক্টের জন্য এটি সহজ এবং সহজ পরীক্ষা করে রাখে ।
extension UIView {
var isVisible: Bool {
guard let _ = self.window else {
return false
}
return true
}
}
তারপরে, আমি কেবল স্টেটমেন্ট চেক করে থাকলে এটি একটি সাধারণ হিসাবে ব্যবহার করি
if myView.isVisible {
// do something
}
আমি আসা করি এটা সাহায্য করবে! :)