ইউআইভিউকন্ট্রোলারের দৃশ্য দৃশ্যমান কিনা তা কীভাবে বলবেন


569

আমার কাছে একটি ট্যাব বার অ্যাপ্লিকেশন রয়েছে, যা অনেক দর্শন সহ। কোনও নির্দিষ্টটি UIViewControllerবর্তমানে এর মধ্যে থেকে দৃশ্যমান কিনা তা জানার কোনও উপায় আছে UIViewController? (একটি সম্পত্তি খুঁজছেন)


উত্তর:


1096

দৃশ্য এর জানালা সম্পত্তি অ শূন্য যদি একটি দৃশ্য বর্তমানে দৃশ্যমান, তাই দৃশ্য নিয়ামক প্রধান দৃশ্য চেক করুন:

Invoking দৃশ্য পদ্ধতি লোড দৃশ্য (যদি এটি লোড করা হয়নি) যা অপ্রয়োজনীয় ও অনাকর্ষণীয় হতে পারে কারণ। এটি ইতিমধ্যে লোড হয়েছে কিনা তা আগে দেখার জন্য আরও ভাল হবে। এই সমস্যাটি এড়াতে আমি কলটি ভিউলয়েডে যুক্ত করেছি।

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

IOS9 সাল থেকে এটি আরও সহজ হয়ে গেছে:

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

অথবা যদি আপনার কাছে কোনও ইউআইএনএভিগেশন কন্ট্রোলার দর্শন নিয়ন্ত্রকদের পরিচালনা করে থাকে তবে আপনি এর পরিবর্তে দৃশ্যমান ভিউকন্ট্রোলার সম্পত্তিটি পরীক্ষা করতে পারেন ।


11
ইউআইএনএভিগেশন কন্ট্রোলারের দৃশ্যমান ভিউকন্ট্রোলি সম্পত্তি নিয়ে একটি সমস্যা হ'ল আপনার দৃশ্যমান ভিউকন্ট্রোলার একটি মডেল ভিউ নিয়ন্ত্রণকারী উপস্থাপন করে। সেক্ষেত্রে মডেল ভিউ দৃশ্যমান ভিউকন্ট্রোলার হয়ে যায়, যা অযাচিত হতে পারে। আপনি কিভাবে এটি পরিচালনা করবেন?
মোশে

12
এটি সম্ভবত সবার কাছে সুস্পষ্ট, তবে আমার জন্য কোডটি সেলফ.আইভিউলয়েড && সেলফ ভিউ.উইন্ডো হতে হয়েছিল
জেফবি 6688

85
অন্যান্য পরিস্থিতিতে এই সমাধানটি সাধারণীকরণে সতর্ক হন। উদাহরণস্বরূপ, আপনি যদি কোনও ইউআইপেজভিউ কনট্রোলার ব্যবহার করেন তবে ইউআইভিউউকন্ট্রোলারদের জন্য দেখা যা বর্তমান পৃষ্ঠা নয়, এখনও তাদের স্ক্রিনটিকে অফ-স্ক্রিন হিসাবে রেন্ডার করা হচ্ছে বলে উইন্ডো সম্পত্তি থাকতে পারে। এক্ষেত্রে আমার নিজের 'ইসক্রেনলিভিজিবল' সম্পত্তি তৈরির ক্ষেত্রে সাফল্য পেয়েছে যা ভিউডিডি অ্যাপায়ার এবং ভিউডিডিস্পিয়ারে সেট হয়ে যায়।
ইভানফ্ল্যাশ

4
@ মোশ সেই ক্ষেত্রে, ব্যবহার করুন topViewController
ma11 শেই 28

3
দয়া করে মনে রাখবেন যে এই উত্তরটি প্রকৃত দৃশ্যমানতা সম্পর্কে কিছুই বলে না। উদাহরণস্বরূপ, যদি অ্যাপ্লিকেশনটি উপরের পটভূমিতে থাকে তবে বিবৃতিটি হ্যাঁ দৃশ্যমান নয় এমনটি হ্যাঁ বলবে।
মারেক জে

89

এখানে 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

47

উপরোক্ত সমাধানগুলি নিয়ে কয়েকটি সমস্যা রয়েছে। উদাহরণস্বরূপ, আপনি যদি ব্যবহার করেন 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;
}

1
এটি কি এখনও এক্সকোড 7.1.1 এ সত্য? আমার ইউআইএসপ্লিটভিউ কনট্রোলারের মাস্টার ভিউকন্ট্রোলআরভিউ.উইনডোর জন্য কোনও ফিরিয়ে দিচ্ছে না। আমি হয়ত কিছু ভুল করছি, তবে আমি নিশ্চিত যে এটি ক্ষেত্রে।
SAHM

44

আপনারা যারা উত্তরের স্যুইফ্ট ২.২ সংস্করণটি সন্ধান করছেন তাদের জন্য :

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

এবং সুইফট 3 :

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

কেন নিশ্চিত তা নয় তবে আমি দেখতে পেয়েছি যে সেল্ফ.ভিউ.উইনডো করা = = শূন্য করার কারণে সেলফ.আইভিউলয়েড সত্য হলেও এটি কখনই কাজ করে না। একবার মুছে ফেলা হলে, এটি ভাল কাজ করে works
মিকাহ মন্টোয়া

এটি কেবলমাত্র ভিডিডিয়ারে আমার পক্ষে কাজ করেছে। আমি যখন এটিকে ভিউ অ্যাপেয়ারে যুক্ত করেছিলাম তখন স্ব.উইউ.উইনডো! = সবসময়ই শূন্য হয়ে আসে
ল্যান্স সামেরিয়া

29

ওভার-পূর্ণ-স্ক্রিন বা ওভার-প্রসঙ্গের মডেল উপস্থাপনার জন্য, "দৃশ্যমান" এর অর্থ এটি ভিউ কন্ট্রোলার স্ট্যাকের শীর্ষে বা কেবল দৃশ্যমান তবে অন্য ভিউ নিয়ামক দ্বারা আবৃত।

ভিউ কন্ট্রোলারটি "শীর্ষ দর্শনের নিয়ামক" কিনা "দৃশ্যমান" থেকে একেবারে আলাদা কিনা তা পরীক্ষা করতে আপনার ভিউ কন্ট্রোলারের নেভিগেশন নিয়ন্ত্রকের ভিউ কন্ট্রোলার স্ট্যাকটি পরীক্ষা করা উচিত।

এই সমস্যাটি সমাধান করার জন্য আমি কোডের একটি অংশ লিখেছি:

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হ'ল সুইফট ৩.০ থেকে সম্পত্তি।
Yuchen Zhong

28

আপনি UITabBarControllerএর selectedViewControllerসম্পত্তি ব্যবহার করতে চান । কোনও ট্যাব বার নিয়ামকের সাথে সংযুক্ত সমস্ত দর্শনীয় কন্ট্রোলারের একটি tabBarControllerসম্পত্তি সেট থাকে, যাতে আপনি যে কোনও ভিউ কন্ট্রোলারের কোডের মধ্যে থেকেই পারেন:

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

2
যদি ভিউ কন্ট্রোলার কোনও নেভিগেশন কন্ট্রোলারের ভিতরে থাকে এবং ট্যাব বার নিয়ামকটিতে সেই নিয়ামক যুক্ত হয় তবে এটি কাজ করে না। নির্বাচিতভিউ কনট্রোলারকে কলটি নেভিগেশন নিয়ামককে ফিরিয়ে দেবে এবং বর্তমান দর্শন নিয়ামককে নয়।
আন্তন হলবার্গ

2
সেক্ষেত্রে @ অ্যান্টন হোলম্বার্গ, এর মতো দৃশ্যমান ((UINavigationController *)self.tabBarController.selectedViewController).visibleViewController
দর্শনীয় নিয়ামকটি পান

অথবা এমনকি আমরা যদি আরও দূরে চলে যাই তবে 'সেল্ট ট্যাটবারকন্ট্রোলআর সিলেক্ট ইন্ডেক্স' সম্পত্তিটি ব্যবহার করুন।
ভ্লাদিমির শুটিউক

12

আমি @ প্রোগ্রামার এর উত্তরের উপর ভিত্তি করে একটি দ্রুত এক্সটেনশন করেছি।

এটি আপনাকে সহজে UIViewControllerস্ক্রিনে আছে কিনা তা পরীক্ষা করতে দেয় :

if someViewController.isOnScreen {
    // Do stuff here
}

প্রসার:

//
//  UIViewControllerExtension.swift
//

import UIKit

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

7

আমার উদ্দেশ্যে, একটি ধারক দর্শন নিয়ন্ত্রকের প্রসঙ্গে, আমি এটি খুঁজে পেয়েছি

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

ভাল কাজ করে.


3

আপনি যদি কোনও ইউআইএনএভিগেশন কন্ট্রোলার ব্যবহার করে থাকেন এবং মডেল ভিউগুলিও পরিচালনা করতে চান তবে নীচেরটি আমি ব্যবহার করি:

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

2
আমি কোনও নেভিগেশন নিয়ামক উপলব্ধ থাকলে গ্রহণযোগ্য উত্তরের চেয়ে আরও নির্ভরযোগ্য হতে পেরেছি। এটি সংক্ষিপ্ত করা যেতে পারে: যদি ([self.navigationController.visibleViewController #KindOfClass: [স্ব শ্রেণি]]) {
ড্যারেন

3

আমি মডেল উপস্থাপিত ভিউ কন্ট্রোলারের জন্য যে পদ্ধতির ব্যবহার করেছি তা হ'ল উপস্থাপিত নিয়ামকের শ্রেণি পরীক্ষা করা। যদি উপস্থাপিত ভিউ কন্ট্রোলার হয় ViewController2তবে আমি কিছু কোড সম্পাদন করব।

UIViewController *vc = [self presentedViewController];

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

3

আমি এই ফাংশন খুঁজে পেয়েছি 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তা সনাক্ত করতে পারে ।


3

আইওএস 8.4 এর জন্য এক্সকোড 6.4, আরসি সক্ষম করেছে

স্পষ্টতই এটি করার প্রচুর উপায়। আমার জন্য যে কাজ করেছে সে হ'ল নিম্নলিখিত ...

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

এটি নিম্নলিখিত উপায়ে যে কোনও ভিউ কন্ট্রোলারে ব্যবহার করা যেতে পারে,

[self.view.window isKeyWindow]

আপনি যদি এই সম্পত্তিটিতে কল করেন -(void)viewDidLoadতবে 0 পাবেন, যদি আপনি -(void)viewDidAppear:(BOOL)animated1 পাওয়ার পরে এই কল করেন ।

আশা করি এটি কাউকে সাহায্য করবে। ধন্যবাদ! চিয়ার্স।


3

আপনি যদি নেভিগেশন নিয়ামক ব্যবহার করে থাকেন এবং কেবল সক্রিয় এবং শীর্ষস্থানীয় নিয়ামক হিসাবে রয়েছেন তা জানতে চান , তবে ব্যবহার করুন:

if navigationController?.topViewController == self {
    // Do something
}

এই উত্তরটি @ মেটডিপাস্কোলে'র মন্তব্যের ভিত্তিতে তৈরি ।

আপনার যদি আরও জটিল পরিস্থিতি থাকে তবে উপরের অন্যান্য উত্তরগুলি দেখুন।


অ্যাপটি পটভূমিতে এবং তারপরে অগ্রভাগে চলে গেলে এটিকে কখনই ডাকা হবে না। আমি এমন একটি সমাধান খুঁজছি যেখানে আমি দেখতে পাচ্ছি যে নিয়ামকটি ব্যবহারকারীর কাছে দৃশ্যমান রয়েছে কি না। ব্যবহারকারী কিছুদিন অ্যাপ্লিকেশন ব্যাকগ্রাউন্ড করতে পারে এবং যখন এটি অগ্রভাগে ফিরে আসে, আমি ইউআই আপডেট করতে চাই। আপনি সাহায্য করতে পারেন দয়া করে আমাকে জানান।
বাইবিসি


0

ভিউ কন্ট্রোলারটি এখনকার দেখা নিয়ন্ত্রক কিনা তা খতিয়ে দেখার জন্য আমার এটি দরকার ছিল, আমি কোনও উপস্থাপিত ভিউ কন্ট্রোলার আছে কিনা বা নেভিগেটরের মাধ্যমে ধাক্কা দিয়েছে কিনা তা যাচাইয়ের মাধ্যমে করেছি, কারও কাছে যদি এরকম সমাধানের প্রয়োজন হয় তবে আমি এটি পোস্ট করছি:

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

0

আমি সুইফট 5 এ এই ছোট এক্সটেনশনটি ব্যবহার করি , যা ইউআইভিউয়ের সদস্য যে কোনও অবজেক্টের জন্য এটি সহজ এবং সহজ পরীক্ষা করে রাখে ।

extension UIView {
    var isVisible: Bool {
        guard let _ = self.window else {
            return false
        }
        return true
    }
}

তারপরে, আমি কেবল স্টেটমেন্ট চেক করে থাকলে এটি একটি সাধারণ হিসাবে ব্যবহার করি

if myView.isVisible {
    // do something
}

আমি আসা করি এটা সাহায্য করবে! :)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.