শীর্ষ সর্বাধিক ইউআইভিউউকন্ট্রোলার পান


191

এ-তে UIViewControllerঅ্যাক্সেস না করেই আমি শীর্ষস্থানটি পাব বলে মনে হচ্ছে না UINavigationController। আমার এখন পর্যন্ত যা আছে তা এখানে:

UIApplication.sharedApplication().keyWindow?.rootViewController?.presentViewController(vc, animated: true, completion: nil)

তবে এটি কিছু করার মনে হচ্ছে না। keyWindowএবং rootViewControllerঅ শূন্য মান খুব হবে বলে মনে হচ্ছে, তাই ঐচ্ছিক chaining একটি বিষয় হওয়া উচিত নয়।

দ্রষ্টব্য: এই জাতীয় কিছু করা খারাপ ধারণা। এটি এমভিসি প্যাটার্নটি ভেঙে দেয়।


এখানে এক বিকল্প সমাধান পাওয়া যায় stackoverflow.com/a/39994115/1872233
iDevAmit

উত্তর:


283

presentViewControllerএকটি ভিউ কন্ট্রোলার দেখায়। এটি কোনও দর্শন নিয়ামককে ফিরিয়ে দেয় না। যদি আপনি একটি ব্যবহার না করে থাকেন তবে আপনি UINavigationControllerসম্ভবত সন্ধান করছেন presentedViewControllerএবং আপনাকে উপস্থাপিত দর্শনগুলির মাধ্যমে মূলে থেকে শুরু করতে হবে এবং পুনরুক্তি করতে হবে।

if var topController = UIApplication.sharedApplication().keyWindow?.rootViewController {
    while let presentedViewController = topController.presentedViewController {
        topController = presentedViewController
    }

    // topController should now be your topmost view controller
}

সুইফ্ট 3+ এর জন্য:

if var topController = UIApplication.shared.keyWindow?.rootViewController {
    while let presentedViewController = topController.presentedViewController {
        topController = presentedViewController
    }

    // topController should now be your topmost view controller
}

আইওএস 13+ এর জন্য

let keyWindow = UIApplication.shared.windows.filter {$0.isKeyWindow}.first

if var topController = keyWindow?.rootViewController {
    while let presentedViewController = topController.presentedViewController {
        topController = presentedViewController
    }

// topController should now be your topmost view controller
}

1
কেউ কি লুপটি ব্যাখ্যা করতে পারে? আমার কাছে মনে হচ্ছে লুপ করার মতো কিছুই নেই; আমিও নিশ্চিত নই কেন এটি সংকলন করে।
অধ্যাপক টম

15
@ প্রফেসরটোম লুপটি যতক্ষণ না topController.presentedViewControllerকিছু ফেরত দেয় ততক্ষণ অবিরত থাকে (যেমন, নিয়ন্ত্রণকারীর একটি উপস্থাপিত শিশু নিয়ামক থাকে)। এটি while letবাস্তবায়নের জন্য যা topController.presentedViewControllerঅবশ্যই কিছু প্রত্যাবর্তন করবে। যদি এটি শূন্য হয় (যেমন, এটি নিয়ামকের কোনও উপস্থাপিত শিশু নেই), তবে এটি লুপিং বন্ধ করবে। লুপের শরীরে, এটি শিশুটিকে স্রোত হিসাবে পুনরায় সাইন করে এবং পুনরায় লুপ topControllerকরে ভিউ কন্ট্রোলার স্তরক্রমকে নীচে নামায়। এটি বাইরের বিবৃতিতে topControllerএকটি হিসাবে এটি পুনরায় নিয়োগ করতে পারে । varif
রিকার্ভ

1
ধন্যবাদ. আমি অনলাইনে কোনও উদাহরণ খুঁজে পাইনি while let। অবশ্যই প্রচুর if letউদাহরণ পাওয়া যায়।
অধ্যাপক টম

1
let x = somethingThatCouldBeNilসিনট্যাক্স যে কোন জায়গায় ব্যবহার করার জন্য একটি সত্য মান / শর্ত ব্যবহার করা যেতে পারে একটি সুপার কুশলী কৌতুক। আমরা যদি এটি এখানে ব্যবহার না করে, আমাদের স্পষ্টভাবে একটি মান নির্ধারণ করতে হবে, তবে এটি আসলে আছে কিনা তা পরীক্ষা করে দেখুন। আমি মনে করি এটি সত্যই সংক্ষিপ্ত এবং অভিব্যক্তিপূর্ণ।
রিকার্ভ

1
আমি কৌতূহলের সাথে পরিচিত, লুপগুলি সম্পর্কে আলোচনা করা আরও কিছুটা কঠিন which যার জন্য আমি উদাহরণগুলির ঘাটতি পেয়েছি – বিশেষত এটি।
অধ্যাপক টম

271

এই এক্সটেনশন আছে

সুইফট ২। *

extension UIApplication {
    class func topViewController(controller: UIViewController? = UIApplication.sharedApplication().keyWindow?.rootViewController) -> UIViewController? {
        if let navigationController = controller as? UINavigationController {
            return topViewController(navigationController.visibleViewController)
        }
        if let tabController = controller as? UITabBarController {
            if let selected = tabController.selectedViewController {
                return topViewController(selected)
            }
        }
        if let presented = controller?.presentedViewController {
            return topViewController(presented)
        }
        return controller
    }
}

সুইফট 3

extension UIApplication {
    class func topViewController(controller: UIViewController? = UIApplication.shared.keyWindow?.rootViewController) -> UIViewController? {
        if let navigationController = controller as? UINavigationController {
            return topViewController(controller: navigationController.visibleViewController)
        }
        if let tabController = controller as? UITabBarController {
            if let selected = tabController.selectedViewController {
                return topViewController(controller: selected)
            }
        }
        if let presented = controller?.presentedViewController {
            return topViewController(controller: presented)
        }
        return controller
    }
}

আপনি এটি আপনার নিয়ামকের যে কোনও জায়গায় ব্যবহার করতে পারেন

if let topController = UIApplication.topViewController() {

}

1
আপনার এক্সটেনশনের টিপটির জন্য ধন্যবাদ :)
থেইন

4
আমি এই উত্তরে একটি গুরুত্বপূর্ণ সম্পাদনা করার চেষ্টা করেছি, তবে এটি প্রত্যাখ্যানিত হয়ে গেছে (কারণ এবং প্রদত্ত টেমপ্লেট কারণগুলি বোঝায় না সে সম্পর্কে আমার কোনও ধারণা নেই): এটি পুনরুক্তিতে ব্যবহারের আগে নাভ.ভিজিবলভিউ কনট্রোলার নিরব আছে কিনা তা পরীক্ষা করা গুরুত্বপূর্ণ: কল (ঠিক কীভাবে ট্যাব.সलेक्ट করা ভিউ কন্ট্রোলার চেক করা হয়) এর মত কারণ অন্যথায়, যদি এটি শূন্য হয় তবে আপনি পুনরাবৃত্তিমূলক অসীম লুপে প্রবেশ করতে পারেন।
ইথান জি

@ ইথানজি আমার উপলব্ধি অনুসারে, যদি নেভ.ভিসিবলভিউ কনট্রোলার শূন্য হয় তবে ফাংশনটি শূন্য হবে (শেষের দিকে নামবে return)। কীভাবে এটি অসীম লুপে প্রবেশ করতে পারে?
ডেসমন্ড ডিএআই

3
আমি মনে করি এটি
ইউআইভিউ কনট্রোলারের

1
আপনি যদি ইউআইটিববারকন্ট্রোলারগুলিতে আধুনিকভাবে উপস্থাপিত ভিউ কন্ট্রোলারদের ধরতে চান তবে সম্ভবত 'উপস্থাপিত ভিউ কনট্রোলার' চেকটি আসা উচিত ..
টোকুরিিকু

65

শীর্ষস্থানীয় ভিউকন্ট্রোলার পেতে 4/5 + টি সুইফ্টের জন্য

// MARK: UIApplication extensions

extension UIApplication {

    class func getTopViewController(base: UIViewController? = UIApplication.shared.keyWindow?.rootViewController) -> UIViewController? {

        if let nav = base as? UINavigationController {
            return getTopViewController(base: nav.visibleViewController)

        } else if let tab = base as? UITabBarController, let selected = tab.selectedViewController {
            return getTopViewController(base: selected)

        } else if let presented = base?.presentedViewController {
            return getTopViewController(base: presented)
        }
        return base
    }
}

ব্যবহারবিধি

if let topVC = UIApplication.getTopViewController() {
   topVC.view.addSubview(forgotPwdView)
}

2
উজ্জ্বল সমাধান। ধন্যবাদ!
অ্যান্ড্রে এম।

2
আইওএস 13.0 এ 'কী উইন্ডো' অবমূল্যায়ন করা হয়েছিল।
rs7

2
'keyWindow' আইওএস 13.0-এ অসমর্থিত হয়েছে stackoverflow.com/a/57899013/4514671
Rebeloper

19
extension UIWindow {

    func visibleViewController() -> UIViewController? {
        if let rootViewController: UIViewController = self.rootViewController {
            return UIWindow.getVisibleViewControllerFrom(vc: rootViewController)
        }
        return nil
    }

    static func getVisibleViewControllerFrom(vc:UIViewController) -> UIViewController {
        if let navigationController = vc as? UINavigationController,
            let visibleController = navigationController.visibleViewController  {
            return UIWindow.getVisibleViewControllerFrom( vc: visibleController )
        } else if let tabBarController = vc as? UITabBarController,
            let selectedTabController = tabBarController.selectedViewController {
            return UIWindow.getVisibleViewControllerFrom(vc: selectedTabController )
        } else {
            if let presentedViewController = vc.presentedViewController {
                return UIWindow.getVisibleViewControllerFrom(vc: presentedViewController)
            } else {
                return vc
            }
        }
    }
}

ব্যবহার:

if let topController = window.visibleViewController() {
    println(topController)
}

এই সমাধান সত্যিই প্রতিশ্রুতি তাকিয়ে তবে আমি এই চালানোর দৃশ্য নিয়ামক আমি যখন আমি একটি ধাক্কা বিজ্ঞপ্তি গ্রহণ উপর আছি পেতে চেষ্টা এবং এটি একটি শূন্য ত্রুটি নিক্ষেপreturn UIWindow.getVisibleViewControllerFrom(presentedViewController.presentedViewController!)
মাইক

@ মাইক আপনাকে কেবল উপস্থাপিত ভিউকন্ট্রোলার ব্যবহার করতে হবে, উপস্থাপন করা ভিউকন্ট্রোলার নয়। উপস্থাপনাভিউ
কনট্রোলার

@ অ্যালায়ার যদি আপনি কোনও মডেল ভিউ কন্ট্রোলারের শীর্ষে কোনও মডেল ভিউ কন্ট্রোলার উপস্থাপন করেন তবে আপনার প্রয়োজন আছে .presentedViewController.presentedViewController, না?
বারান এমরে

6

ডায়ানজ উত্তরের ভিত্তিতে, উদ্দেশ্য-সি সংস্করণ

- (UIViewController *) topViewController {
   UIViewController *baseVC = UIApplication.sharedApplication.keyWindow.rootViewController;
   if ([baseVC isKindOfClass:[UINavigationController class]]) {
       return ((UINavigationController *)baseVC).visibleViewController;
   }

   if ([baseVC isKindOfClass:[UITabBarController class]]) {
       UIViewController *selectedTVC = ((UITabBarController*)baseVC).selectedViewController;
       if (selectedTVC) {
           return selectedTVC;
       }
   }

   if (baseVC.presentedViewController) {
       return baseVC.presentedViewController;
   }
   return baseVC;
}

ইউআইটিববারকন্ট্রোলারে ইউআইএনএভিগেশন কন্ট্রোলারের জন্য কাজ করবে না। এটি ইউআইএনএভিগেশন কন্ট্রোলারকে ফিরিয়ে দেবে, নেভিগেশন আটকে থাকা শীর্ষস্থানীয় নিয়ন্ত্রণকারীকে ফিরিয়ে দেওয়া উচিত।
মাইক.আর


6

আমি @ ডায়ানজের উত্তরটি পছন্দ করেছি এবং তাই এটির দ্রুততম 3 এর সংস্করণ এখানে। এটি মূলত একই জিনিস তবে তার একটি কোঁকড়ানো ধনুর্বন্ধনী অনুপস্থিত এবং সিনট্যাক্স / ভেরিয়েবল / পদ্ধতির কিছু নাম পরিবর্তন হয়েছে। তাই এখানে!

extension UIApplication {
    class func topViewController(base: UIViewController? = UIApplication.shared.keyWindow?.rootViewController) -> UIViewController? {
        if let nav = base as? UINavigationController {
            return topViewController(base: nav.visibleViewController)
        }
        if let tab = base as? UITabBarController {
            if let selected = tab.selectedViewController {
                return topViewController(base: selected)
            }
        }
        if let presented = base?.presentedViewController {
            return topViewController(base: presented)
        }
        return base
    }
}

ব্যবহার এখনও ঠিক একই যদিও:

if let topController = UIApplication.topViewController() {
    print("The view controller you're looking at is: \(topController)")
}

6

https://gist.github.com/db0company/369bfa43cb84b145dfd8 আমি এই সাইটে উত্তর এবং মন্তব্যে কিছু পরীক্ষা করেছি। আমার জন্য, নিম্নলিখিত কাজ করে

extension UIViewController {
    func topMostViewController() -> UIViewController {

        if let presented = self.presentedViewController {
            return presented.topMostViewController()
        }

        if let navigation = self as? UINavigationController {
            return navigation.visibleViewController?.topMostViewController() ?? navigation
        }

        if let tab = self as? UITabBarController {
            return tab.selectedViewController?.topMostViewController() ?? tab
    }

        return self
    }
}

extension UIApplication {
    func topMostViewController() -> UIViewController? {
        return self.keyWindow?.rootViewController?.topMostViewController()
    }
}

তারপরে, শীর্ষ ভিউ কন্ট্রোলার এর মাধ্যমে পান:

UIApplication.shared.topMostViewController()

5

শীর্ষস্থানীয় সর্বাধিক ইউআইভিউকন্ট্রোলার সন্ধান করতে এই কোডটি ব্যবহার করুন

func getTopViewController() -> UIViewController? {
    var topController: UIViewController? = UIApplication.shared.keyWindow?.rootViewController
    while topController?.presentedViewController != nil {
        topController = topController?.presentedViewController
    }
    return topController
}

2
রিকার্ভের উত্তর থেকে এটি কীভাবে আলাদা?
ইলেক্ট্রোবুদ্ধ

5

কোনও ফাংশনের পরিবর্তে একটি কম্পিউটেড ভেরিয়েবল ব্যবহার করে @ অ্যালবারজুতে সামান্য তারতম্য

extension UIViewController {
  var topMostViewController : UIViewController {

    if let presented = self.presentedViewController {
      return presented.topMostViewController
    }

    if let navigation = self as? UINavigationController {
      return navigation.visibleViewController?.topMostViewController ?? navigation
    }

    if let tab = self as? UITabBarController {
      return tab.selectedViewController?.topMostViewController ?? tab
    }

    return self
  }
}

extension UIApplication {
  var topMostViewController : UIViewController? {
    return self.keyWindow?.rootViewController?.topMostViewController
  }
}

তারপর বল

if let topViewControler = UIApplication.shared.topMostViewController {
    ... do stuff
}

4

উপরে বব-সি উপর ভিত্তি করে:

সুইফট 3.0

extension UIWindow {


    func visibleViewController() -> UIViewController? {
        if let rootViewController: UIViewController  = self.rootViewController {
            return UIWindow.getVisibleViewControllerFrom(vc: rootViewController)
        }
        return nil
    }

    class func getVisibleViewControllerFrom(vc:UIViewController) -> UIViewController {

        if vc.isKind(of: UINavigationController.self) {

            let navigationController = vc as! UINavigationController
            return UIWindow.getVisibleViewControllerFrom( vc: navigationController.visibleViewController!)

        } else if vc.isKind(of: UITabBarController.self) {

            let tabBarController = vc as! UITabBarController
            return UIWindow.getVisibleViewControllerFrom(vc: tabBarController.selectedViewController!)

        } else {

            if let presentedViewController = vc.presentedViewController {

                return UIWindow.getVisibleViewControllerFrom(vc: presentedViewController)

            } else {

                return vc;
            }
        }
    }
}

3

অনেক স্বাদ কিন্তু কোনও পুনরাবৃত্তির বর্ণনা দেয় না। পূর্ববর্তীগুলির সাথে সংযুক্ত:

     func topMostController() -> UIViewController? {
        var from = UIApplication.shared.keyWindow?.rootViewController
        while (from != nil) {
            if let to = (from as? UITabBarController)?.selectedViewController {
                from = to
            } else if let to = (from as? UINavigationController)?.visibleViewController {
                from = to
            } else if let to = from?.presentedViewController {
                from = to
            } else {
                break
            }
        }
        return from
    }

2

আপনি অ্যাপডেলিগেটে একটি ইউআইভিউসকন্ট্রোলার ভেরিয়েবল সংজ্ঞায়িত করতে পারেন এবং প্রতিটি ভিউয়ে উইলঅ্যাপিয়ারে ভেরিয়েবলটি স্বতে সেট করতে পারেন however (তবে ডায়ানজ উত্তরটি সেরা উত্তর))

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    let appDel = UIApplication.sharedApplication().delegate as! AppDelegate
    appDel.currentVC = self
}

1
অনেক ধন্যবাদ, যখন এটি নেভিগেশন পাওয়ার চেষ্টা করল তখন আমার পক্ষে এটি অন্য সমাধান হিসাবে ঠিকঠাক হয়ে গেছে, এটি পুনরায় ফিরে আসুন নিয়ন্ত্রণটি ফিরে আসুন যাতে আমি কোনও নতুন উপাচার্যকে ধাক্কা দিতে সক্ষম হই না
আমর অ্যাগ্রি

নিশ্চিত করুন যে বর্তমানভিসিটি দুর্বল রেফারেন্স হিসাবে সংজ্ঞায়িত হয়েছে, বা আপনার মেমরি ফাঁস হবে।
বুবুকু

2

স্যুইফ্ট 3 এ দৃশ্যমান ভিউ কন্ট্রোলারটি সন্ধান করতে

if let viewControllers = window?.rootViewController?.childViewControllers {

     let prefs = UserDefaults.standard

     if viewControllers[viewControllers.count - 1] is ABCController{
        print("[ABCController] is visible")

     }
}

এই কোডটি সর্বশেষ যুক্ত হওয়া বা শেষ সক্রিয় নিয়ামকটি দৃশ্যমান সন্ধান করে।

এটি আমি সক্রিয় দর্শনীয় নিয়ামক সন্ধান করতে অ্যাপডেলিগেটে ব্যবহার করেছি


2
import UIKit

extension UIApplication {

    // MARK: Choose keyWindow as per your choice
    var currentWindow: UIWindow? {
        connectedScenes
        .filter({$0.activationState == .foregroundActive})
        .map({$0 as? UIWindowScene})
        .compactMap({$0})
        .first?.windows
        .filter({$0.isKeyWindow}).first
    }

    // MARK: Choose keyWindow as per your choice
    var keyWindow: UIWindow? {
        UIApplication.shared.windows.first { $0.isKeyWindow }
    }

    class func topMostViewController(base: UIViewController? = UIApplication.shared.currentWindow?.rootViewController) -> UIViewController? {

        if let nav = base as? UINavigationController {
            return topMostViewController(base: nav.visibleViewController)
        }

        if let tab = base as? UITabBarController {
            let moreNavigationController = tab.moreNavigationController

            if let top = moreNavigationController.topViewController, top.view.window != nil {
                return topMostViewController(base: top)
            } else if let selected = tab.selectedViewController {
                return topMostViewController(base: selected)
            }
        }
        if let presented = base?.presentedViewController {
            return topMostViewController(base: presented)
        }
        return base
    }
}

'দৃশ্যমান ভিউ কনট্রোলার' এর অস্পষ্ট ব্যবহার
ওমর এন

1

আপনি কোডটি কোথায় রেখেছিলেন?

আমি আপনার কোডটি আমার ডেমোতে চেষ্টা করে দেখি, আপনি কোডটি ভিতরে রাখলে

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 

ব্যর্থ হবে, কারণ কী উইন্ডোটি এখনও সেট করেছে।

তবে আমি আপনার কোডটি কিছু ভিউ কন্ট্রোলারে রেখেছি

override func viewDidLoad() {

এটা ঠিক কাজ করে।


এটা ভিতরে না didFinishLaunchingWithOptions। আমার কেবল বিভিন্ন ডিবাগ উদ্দেশ্যে এটি প্রয়োজন।
জয়ট

1

খুব বিরল ক্ষেত্রে, কাস্টম সিগু সহ, শীর্ষ সর্বাধিক দেখা নিয়ন্ত্রক কোনও নেভিগেশন স্ট্যাক বা ট্যাব বার নিয়ামক বা উপস্থাপিত নয়, তবে এর ভিউটি কী উইন্ডাউন এর সাবউভিউগুলির শীর্ষে সন্নিবেশ করা হয়েছে।

এই পরিস্থিতিতে, UIApplication.shared.keyWindow.subviews.last == self.viewবর্তমান ভিউ কন্ট্রোলার সর্বাধিক সর্বাধিক কিনা তা নির্ধারণ করা দরকার কিনা তা পরীক্ষা করা দরকার ।


1

যে কেউ সুইফ্ট 5 / আইওএস 13+ সমাধান সন্ধান করছে তাদের জন্য ( keywindowআইওএস 13 এর পরে অবহেলা করা হয়েছে)

extension UIApplication {

    class func getTopMostViewController() -> UIViewController? {
        let keyWindow = UIApplication.shared.windows.filter {$0.isKeyWindow}.first
        if var topController = keyWindow?.rootViewController {
            while let presentedViewController = topController.presentedViewController {
                topController = presentedViewController
            }
            return topController
        } else {
            return nil
        }
    }
}

0
  var topViewController: UIViewController? {
        guard var topViewController = UIApplication.shared.keyWindow?.rootViewController else { return nil }
        while let presentedViewController = topViewController.presentedViewController {
            topViewController = presentedViewController
        }
        return topViewController
    }

0

আমার জন্য সেরা সমাধানটি একটি ফাংশন সহ একটি এক্সটেনশন। এই এক্সটেনশনটি সহ একটি সুইফ্ট ফাইল তৈরি করুন

প্রথমটি হল ইউআই উইন্ডো এক্সটেনশন :

public extension UIWindow {
    var visibleViewController: UIViewController? {
        return UIWindow.visibleVC(vc: self.rootViewController)
    }

    static func visibleVC(vc: UIViewController?) -> UIViewController? {
        if let navigationViewController = vc as? UINavigationController {
            return UIWindow.visibleVC(vc: navigationViewController.visibleViewController)
        } else if let tabBarVC = vc as? UITabBarController {
            return UIWindow.visibleVC(vc: tabBarVC.selectedViewController)
        } else {
            if let presentedVC = vc?.presentedViewController {
                return UIWindow.visibleVC(vc: presentedVC)
            } else {
                return vc
            }
        }
    }
}

যে ফাইল ভিতরে ফাংশন যোগ করুন

func visibleViewController() -> UIViewController? {
    let appDelegate = UIApplication.shared.delegate
    if let window = appDelegate!.window {
        return window?.visibleViewController
    }
    return nil
}

এবং আপনি যদি এটি ব্যবহার করতে চান তবে আপনি এটিকে যে কোনও জায়গায় কল করতে পারেন। উদাহরণ :

  override func viewDidLoad() {
    super.viewDidLoad()
      if let topVC = visibleViewController() {
             //show some label or text field 
    }
}

ফাইল কোডটি এরকম :

import UIKit

public extension UIWindow {
    var visibleViewController: UIViewController? {
        return UIWindow.visibleVC(vc: self.rootViewController)
    }

    static func visibleVC(vc: UIViewController?) -> UIViewController? {
        if let navigationViewController = vc as? UINavigationController {
            return UIWindow.visibleVC(vc: navigationViewController.visibleViewController)
        } else if let tabBarVC = vc as? UITabBarController {
            return UIWindow.visibleVC(vc: tabBarVC.selectedViewController)
        } else {
            if let presentedVC = vc?.presentedViewController {
                return UIWindow.visibleVC(vc: presentedVC)
            } else {
                return vc
            }
        }
    }
}

func visibleViewController() -> UIViewController? {
    let appDelegate = UIApplication.shared.delegate
    if let window = appDelegate!.window {
        return window?.visibleViewController
    }
    return nil
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.