আমি কীভাবে কোনও পুশ কন্ট্রোলার থেকে রুটভিউ কনট্রোলার পেতে পারি?


137

সুতরাং, আমি রুটভিউ কনট্রোলার থেকে একটি ভিউ কন্ট্রোলারকে এই জাতীয় ধাক্কা দিয়েছি:

[স্ব-নেভিগেশন কন্ট্রোলার পুশভিউ কনট্রোলার: অন্য ভিউকন্ট্রোলার অ্যানিমেটেড: হ্যাঁ];

কিন্তু anotherViewControllerএখন থেকে , আমি আবার রুটভিউ নিয়ন্ত্রণকারীকে অ্যাক্সেস করতে চাই।

আমি চেষ্টা করছি

// (এখন অন্য ভিউকন্ট্রোলারের ভিতরে)
/// রুটভিউ কনট্রোলার * রুট = (রুটভিউ কনট্রোলার *) সেল্ফ.প্যারেন্টভিউ কন্ট্রোলার; // না
// ভুল
রুটভিউ কনট্রোলার * রুট = (রুটভিউ কনট্রোলার *) [সেল্ফ-নেভিগেশনকন্ট্রোলআরভিউ কনট্রোলারস অবজেক্টএটিআইডেক্স: 0]; // হ্যাঁ!! এটা কাজ করে

আমি নিশ্চিত যে এটি কেন কাজ করে এবং আমি নিশ্চিত নই যে এটি করার সর্বোত্তম উপায়। আপনি যে রুটভিউ কনট্রোলারের ন্যাভিগেশনকন্ট্রোলারে রেখেছেন এমন কোনও নিয়ন্ত্রক থেকে রুটভিউ কনট্রোলার পাওয়ার আরও ভাল উপায়ের বিষয়ে কেউ মন্তব্য করতে পারেন এবং আমি যেভাবে এটি করেছি তা নির্ভরযোগ্য বা না?


আপনি যা করেছেন তা নির্ভরযোগ্যভাবে রুট ভিউ কন্ট্রোলারটি পাবেন (নেভিগেশন হায়ারার্কির প্রথমটি), আপনি যদি "পিছনে" ভিউ কন্ট্রোলারের অ্যাক্সেস পেতে চান তবে আমার উত্তর দেখুন।
বেন এস

উত্তর:


133

ইউআইএনএভিগেশন কন্ট্রোলারের ভিউকন্ট্রোলার সম্পত্তি ব্যবহার করুন । উদাহরণ কোড:

// Inside another ViewController
NSArray *viewControllers = self.navigationController.viewControllers;
UIViewController *rootViewController = [viewControllers objectAtIndex:viewControllers.count - 2];

এটি "ফিরে" ভিউ নিয়ামক পাওয়ার আদর্শ উপায়। কারণ objectAtIndex:0কাজ কারণ দৃশ্য নিয়ামক আপনি অ্যাক্সেস করার চেষ্টা করছেন এছাড়াও, রুট এক যদি আপনি পরিভ্রমন গভীর ছিল, ফিরে দেখুন রুট দৃশ্য হিসাবে একই হবে না।


6
:) টাই এটি এখনও অবাস্তব বলে মনে হচ্ছে - :) আমি সত্যিই একজন "অফিসিয়াল" সদস্যের কাজটি করতে চেয়েছিলাম, সেল্ফ-নেভিগেশন কন্ট্রোলআর্রোটভিউ কনট্রোলারের মতো কিছু, তবে হায়, এ জাতীয় কিছু নেই ..
বোবোবো নভো

62
উপরের কোডটি ভ্রান্ত। এটির আগে rootViewControllerঅনুপস্থিত *এবং সূচিটি ঠিক হওয়া উচিত 0। প্রশ্নের কোডটি সঠিক:RootViewController *root = (RootViewController *)[navigationController.viewControllers objectAtIndex:0]
ma11 she28

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

২ য় লাইনে পড়তে হবে: ইউআইভিউউকন্ট্রোলার * রুটভিউ কনট্রোলার = [ভিউকন্ট্রোলাররা অবজেক্টএটিআইডেক্স: ভিউকন্ট্রোলারসকাউন্ট - 1];
বিলি

177

সুইফ্ট সংস্করণ:

var rootViewController = self.navigationController?.viewControllers.first

উদ্দেশ্য সংস্করণ:

UIViewController *rootViewController = [self.navigationController.viewControllers firstObject];

যেখানে স্বতন্ত্র একটি ইউআইভিউউকন্ট্রোলারের একটি ইউআইএনএভিগেশন কন্ট্রোলারের মধ্যে এম্বেড থাকা উদাহরণ।


আমি কি অন্য শ্রেণি থেকে অন্য ভিউকন্ট্রোলারের নেভিগেশনকন্ট্রোলার পেতে পারি?
sasquatch

যে কোনও ইউআইভিউকন্ট্রোলার সাবক্লাসে একটি নেভিগেশনকন্ট্রোলার সম্পত্তি থাকবে যা এটি প্রথম প্যারেন্টভিউকন্ট্রোলারের সাথে মেলে এমন ইউআইএনএভিগেশন কন্ট্রোলার শ্রেণিতে নির্দেশ করে।
দুলগান

12

এই সমস্ত উত্তরে উল্লিখিত একই জিনিসটির সামান্য কম কুরুচিপূর্ণ সংস্করণ:

UIViewController *rootViewController = [[self.navigationController viewControllers] firstObject];

আপনার ক্ষেত্রে, আমি সম্ভবত কিছু করতে চাই:

আপনার ইউআইএনএভিগেশন কন্ট্রোলার সাবক্লাসের ভিতরে :

- (UIViewController *)rootViewController
{
    return [[self viewControllers] firstObject];
}

তাহলে আপনি ব্যবহার করতে পারেন:

UIViewController *rootViewController = [self.navigationController rootViewController];

সম্পাদন করা

ওপ মন্তব্যে একটি সম্পত্তি চেয়েছিলেন।

যদি আপনি চান তবে আপনি self.navigationController.rootViewControllerনিজের শিরোনামে কেবলমাত্র পঠনযোগ্য সম্পত্তি যুক্ত করে কোনও কিছুর মাধ্যমে এটি অ্যাক্সেস করতে পারেন :

@property (nonatomic, readonly, weak) UIViewController *rootViewController;

8

যারা দ্রুত বর্ধনে আগ্রহী তাদের জন্য, আমি এখন এটি ব্যবহার করছি:

extension UINavigationController {
    var rootViewController : UIViewController? {
        return self.viewControllers.first
    }
}

1
ধন্যবাদ! এছাড়াও আপনি "
ইউআইভিউ কনট্রোলার

3

অতিরিক্ত হিসাবে @ dulgan এর উত্তর, এটা সবসময় ব্যবহার করার জন্য একটি ভাল পন্থা firstObjectউপর objectAtIndex:0, কারণ যখন প্রথম এক রিটার্ন Nil যদি অ্যারের মধ্যে কোন বস্তু নয়, আধুনিক এক ব্যতিক্রম ছোঁড়ার।

UIViewController *rootViewController = self.navigationController.rootViewController;

বিকল্পভাবে, এটি নামের একটি বিভাগ তৈরি করা UINavigationController+Additionsএবং এতে আপনার পদ্ধতিটি সংজ্ঞায়িত করা আপনার পক্ষে একটি বড় প্লাস হতে পারে ।

@interface UINavigationController (Additions)

- (UIViewController *)rootViewController;

@end

@implementation UINavigationController (Additions)

- (UIViewController *)rootViewController
{
    return self.viewControllers.firstObject;
}

@end

আমি আপনার উত্তরটি না পড়েই এই অংশটি যুক্ত করেছি, আপনি "ফার্স্টবজেক্ট" আরও ভাল করার পক্ষে সম্পূর্ণরূপে ঠিক আছেন [0]
দুলগান

1

কিভাবে জিজ্ঞাসা সম্পর্কে UIApplication Singleton তার জন্য keyWindow , এবং থেকে UIWindow (তার শিকড় দৃশ্য নিয়ামক জন্য অনুরোধ rootViewController সম্পত্তি):

UIViewController root = [[[UIApplication sharedApplication] keyWindow] rootViewController];

কীভাবে নেভিগেশন নিয়ামক পাবেন?
ইয়েস্টে মুরাতভ

এটি যদি আমার অ্যাপ্লিকেশনের রুটভিউ কনট্রোলারটি ইউআইটিববারভিউকন্ট্রোলার হয় তবে এটি একটি ভুল পরামর্শ?
সন্দীপ সিং রানা

1

এখানে আমি যে কোনও জায়গা থেকে রুটে নেভিগেট করতে সর্বজনীন পদ্ধতি নিয়ে এসেছি।

  1. আপনি এই শ্রেণীর সাহায্যে একটি নতুন ক্লাস ফাইল তৈরি করেন, যাতে এটি আপনার প্রকল্পের যে কোনও জায়গা থেকে অ্যাক্সেসযোগ্য:

    import UIKit
    
    class SharedControllers
    {
        static func navigateToRoot(viewController: UIViewController)
        {
            var nc = viewController.navigationController
    
            // If this is a normal view with NavigationController, then we just pop to root.
            if nc != nil
            {
                nc?.popToRootViewControllerAnimated(true)
                return
            }
    
            // Most likely we are in Modal view, so we will need to search for a view with NavigationController.
            let vc = viewController.presentingViewController
    
            if nc == nil
            {
                nc = viewController.presentingViewController?.navigationController
            }
    
            if nc == nil
            {
                nc = viewController.parentViewController?.navigationController
            }
    
            if vc is UINavigationController && nc == nil
            {
                nc = vc as? UINavigationController
            }
    
            if nc != nil
            {
                viewController.dismissViewControllerAnimated(false, completion:
                    {
                        nc?.popToRootViewControllerAnimated(true)
                })
            }
        }
    }
  2. আপনার প্রকল্পের যে কোনও জায়গা থেকে ব্যবহার:

    {
        ...
        SharedControllers.navigateToRoot(self)
        ...
    }

0

এটি আমার পক্ষে কাজ করেছে:

আমার রুট ভিউ কন্ট্রোলার যখন একটি নেভিগেশন নিয়ামককে এম্বেড করা হয়:

UINavigationController * navigationController = (UINavigationController *)[[[[UIApplication sharedApplication] windows] firstObject] rootViewController];
RootViewController * rootVC = (RootViewController *)[[navigationController viewControllers] firstObject];

মনে রাখবেন যে keyWindowহ্রাস করা হয়েছে।

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