আমি কীভাবে নেভিগেশন নিয়ামক থেকে একবারে দুটি দর্শন পপ করব?


92

আমি নেভিগেশন স্ট্যাকের তৃতীয় দৃশ্যে প্রথম দর্শনে ফিরে যেতে চাই।

আমি জানি কীভাবে একবারে একটি ভিউ পপ করতে হয়:

[self.navigationController popViewControllerAnimated:YES];

তবে আমি কীভাবে একবারে দুটি করব?


4
মেটা মন্তব্য: @ লুবিলিসের সমস্ত দিক দিয়ে উত্তর দেওয়া ভাল। শীর্ষ রেট করা উত্তরগুলি তাদের সময়ে ভাল ছিল তবে আর প্রাসঙ্গিক নয়।
n13

উত্তর:


133

আপনি এটিকে নেভিগেশন নিয়ামক স্ট্যাকের মধ্যেও লাফিয়ে দেখতে চেষ্টা করতে পারেন

NSMutableArray *allViewControllers = [NSMutableArray arrayWithArray:[self.navigationController viewControllers]];
for (UIViewController *aViewController in allViewControllers) {
    if ([aViewController isKindOfClass:[RequiredViewController class]]) {
        [self.navigationController popToViewController:aViewController animated:NO];
    }
}

6
ইমো এটি এখন পর্যন্ত সর্বোত্তম পদ্ধতি, তবে আপনি নিজের ইউএনএভিগেশন কন্ট্রোলারকে স্ব.নিভিশনকন্ট্রোলার ব্যবহার করে উল্লেখ করতে পারেন
হেঞ্জহংলি

4
আমি সম্মত, যদি ব্যবহারকারী কোনও নির্দিষ্ট ভিউকন্ট্রোলারে স্ট্যাকটি পপ করতে চান তবে এটিই সেরা সমাধান। আসুন আমরা জানি যে কোন ভিউ কনট্রোলারটি তা আপনি জানেন না, আপনি এখনও এমন একটি সিস্টেম প্রয়োগ করতে পারেন যেখানে আপনি স্ট্যাকটি পপ অফ করতে এবং অলভিউকন্ট্রোলারস অ্যারে থেকে লক্ষ্য ভিউকন্ট্রোলারটি পেতে চান এমন লক্ষ্য নির্দিষ্ট করে দেবেন: (allViewControllers.count - 1 - পরিমাণ)। -1 কারণ অ্যারেগুলি শূন্য-ভিত্তিক কোর্স।
জোভান

4
এই সমাধান ভালবাসা। ঠিক আমি কী সন্ধান করছিলাম
Designer023

4
আসল নেভিগেটর-> ভিউকন্ট্রোলার অ্যারে (পুনরুদ্ধারযোগ্য অ্যারেতে রূপান্তর করার দরকার নেই) দিয়ে পুনরুক্তি করার সময়ও কাজ করে
অ্যারিক সেগাল

বিঃদ্রঃ! এটি প্রথম থেকে -> শেষ পর্যন্ত স্ট্যাকটিকে পুনরাবৃত্তি করবে, ঠিক সঠিক হতে আপনার স্ট্যাকটি বিপরীত করা উচিত। কারণ আপনার যদি একই ধরণের বেশ কয়েকটি ভিসি থাকে তবে আপনি স্ট্যাকের মধ্যে ভুল ক্রমে ভুল ভিসি মুছে ফেলবেন।
স্ট্যাকউন্ডারফ্লো

72

এখানে দুটি UINavigationControllerএক্সটেনশন রয়েছে যা আপনার সমস্যার সমাধান করতে পারে। আমি প্রথমটি ব্যবহার করে সুপারিশ করব যা UIViewControllerনির্দিষ্ট শ্রেণীর একটিতে পপ হয় :

extension UINavigationController {

  func popToViewController(ofClass: AnyClass, animated: Bool = true) {
    if let vc = viewControllers.filter({$0.isKind(of: ofClass)}).last {
      popToViewController(vc, animated: animated)
    }
  }

  func popViewControllers(viewsToPop: Int, animated: Bool = true) {
    if viewControllers.count > viewsToPop {
      let vc = viewControllers[viewControllers.count - viewsToPop - 1]
      popToViewController(vc, animated: animated)
    }
  }

}

এবং এটি এর মতো ব্যবহার করুন:

// pop to SomeViewController class
navigationController?.popToViewController(ofClass: SomeViewController.self)

// pop 2 view controllers
navigationController?.popViewControllers(viewsToPop: 2)

4
সুইফ্টের জন্য (বিকল্প 1), আপনি দুটি removeLastদিয়ে প্রতিস্থাপন করতে পারেন ঠিক removeLast(2)
ডমিনিক কে

নিয়ন্ত্রণকারীদের জীবনচক্রের কলিং পদ্ধতি সম্পর্কে কী বলা যায়? ডিড এয়ার এবং ect
মাইক Glukhov

4
(সুইফ্ট 4) আপনি এই লাইনে বন্ধনীগুলি হারিয়েছেন let vc = viewControllers[viewControllers.count - viewsToPop + 1], সঠিকভাবে কাজ করার জন্য আপনাকে এটিকে প্রতিস্থাপন করতে হবে: let vc = viewControllers[viewControllers.count - (viewsToPop + 1)]বাlet vc = viewControllers[viewControllers.count - viewsToPop - 1]
এমিরোস্লাভ

@ মিরোস্লাভ আপনার ঠিক আছে আমি আমার উত্তর আপডেট করেছি। আপনাকে ধন্যবাদ /
হাভালা

4
আমি নীচে আমার উত্তর পোস্ট করার পরে এই উত্তরটি আপডেট করা হয়েছে। মূলত আমার কোডের একটি অনুলিপি ^ _ ^
লুবিলিস

44

আপনি এর সাথে "রুট" (প্রথম) দেখার নিয়ামকটিতে পপ করতে পারেন popToRootViewControllerAnimated:

[self.navigationController popToRootViewControllerAnimated:YES];

// If you want to know what view controllers were popd:
// NSArray *popdViewControllers = [self.navigationController popToRootViewControllerAnimated:YES];

UINavigationControllerতথ্যসূত্র :

রুট ভিউ কন্ট্রোলার ব্যতীত স্ট্যাকের সমস্ত ভিউ কন্ট্রোলারকে পপ করে এবং ডিসপ্লে আপডেট করে।

প্রত্যাবর্তন মান
স্ট্যাক থেকে পপ করা হয়েছে এমন দর্শনীয় কন্ট্রোলারের একটি অ্যারে।


4
হ্যা, বিশ্বাস করতে পারি না আমি এত সাধারণ উত্তর খুঁজতে এতক্ষণ সময় কাটিয়েছি, ধন্যবাদ!
অ্যাডাম ওয়েইট

4
সুইফট 3: সেলফাইভিশনকন্ট্রোলার? পপটোরোটভিউ কনট্রোলার (অ্যানিমেটেড: সত্য);
dianakarenms

অবশ্যই আমি যা খুঁজছিলাম!
কানকলস্যান্ডউইচ

29
[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:1] animated:YES];   

অবজেক্টএটিডেক্স: 1 -> আপনি যে কোনও সূচকটিতে পপ করতে চান তা পাস করতে পারেন


কৌতুকের জন্য ধন্যবাদ, আমি এটি প্রায় ভুল উপায়ে করতে চলেছিলাম।
লিনাস

18

সুইফট 2 - এক্সকোড 7.3

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

extension UINavigationController {

    func popToViewControllerOfType(classForCoder: AnyClass) {
        for controller in viewControllers {
            if controller.classForCoder == classForCoder {
                popToViewController(controller, animated: true)
                break
            }
        }
    }

    func popViewControllers(controllersToPop: Int, animated: Bool) {
        if viewControllers.count > controllersToPop {
            popToViewController(viewControllers[viewControllers.count - (controllersToPop + 1)], animated: animated)
        } else {
            print("Trying to pop \(controllersToPop) view controllers but navigation controller contains only \(viewControllers.count) controllers in stack")
        }
    }
}

4
এটি আরও upvoting প্রয়োজন ..। আমি ঠিক এই এক্সটেনশন লিখতে ছিল। আমি কেবল আপনার ধন্যবাদ ব্যবহার করব;)
n13

4
@ n13 কীভাবে বুড়িদিনোর উত্তরের চেয়ে ভাল?
ক্র্যাশলোট

4
একটি এক্সটেনশন ব্যবহার করা অনেক ক্লিনার কোড তৈরি করে। আপনি বুডিডিনোর উত্তর নিতে পারেন এবং এটি থেকে একটি এক্সটেনশন তৈরি করতে পারেন তবে এটি আপনাকে প্রচেষ্টাটি বাঁচায়। এছাড়াও এই উত্তরটি ত্রুটি মামলার জন্য পরীক্ষা করে এবং ত্রুটিগুলি
গ্রেফতার করে

4
আমি এই উত্তর পছন্দ। আমাকে পোস্ট করা উত্তরটি পুনর্বিবেচনা এবং আপডেট করে। আমি ভিউকন্ট্রোলার্স অ্যারেতে অনুসন্ধান কোডটির শেষ উদাহরণে আমার কোডটি পপ করেছি কারণ সম্ভবত এটি পছন্দসই আচরণ।
বুডিডিনো

15

যদি আপনি কেবল একবারে 2 পপ করতে চান কারণ আপনার রুটভিউ কনট্রোলারটি (গভীরভাবে) আরও গভীর হয় তবে 2 আপনি উদাহরণস্বরূপ ইউআইভিউ কনট্রোলারটিতে একটি বিভাগ যুক্ত করার বিষয়টি বিবেচনা করতে পারেন:

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

#import <UIKit/UIKit.h>
@interface UINavigationController (popTwice)

- (void) popTwoViewControllersAnimated:(BOOL)animated;

@end

ইউআইএনএভিগেশন কন্ট্রোলার + পপটাইস.এম

#import "UINavigationController+popTwice.h"

@implementation UINavigationController (popTwice)

- (void) popTwoViewControllersAnimated:(BOOL)animated{
    [self popViewControllerAnimated:NO];
    [self popViewControllerAnimated:animated];
}

@end

#import "UINavigationController+popTwice.h"আপনার বাস্তবায়নের কোথাও বিভাগটি আমদানি করুন এবং একবারে 2 টি নিয়ন্ত্রককে পপ করতে কোডের এই লাইনটি ব্যবহার করুন:

[self.navigationController popTwoViewControllersAnimated:YES];

এটা দুর্দান্ত না? :)


6
আপনার যদি তিনটি ভিউ পপ করতে হয় তবে আপনি "ইউআইএনএভিগেশন কন্ট্রোলার + পপথ্রিস.এম" লিখবেন ???????
মিলিত

8
আপনি পপ করার জন্য ভিউকন্ট্রোলারগুলির সংখ্যার জন্য কেবলমাত্র একটি প্যারামিটারে যেতে পেরেছেন এবং [স্ব পপভিউকন্ট্রোলার এনিমেটেড: কোন]; গণনা -১ এর একটি লুপের মধ্যে।
noRema

এটি সঠিক উপায়ে নয়, আপনি যদি ২,৩০ টি পোর্ট করতে চান ... ... কোনও নিয়ামক এটি লুপ দিয়ে সনাক্ত করতে পারেন এবং তারপরে [self.navicationController popToViewControllerAnimated: YES] ;. উপরে উল্লিখিত এইটি খুব খারাপ কোডিং এবং এটি ফ্লিকারযুক্ত ইউআই এবং খারাপ ব্যবহারকারীর অভিজ্ঞতা দেখাতে পারে।
ভিকি ধস

10

সুইফট 4:

func popViewControllerss(popViews: Int, animated: Bool = true) {
    if self.navigationController!.viewControllers.count > popViews
    {
        let vc = self.navigationController!.viewControllers[self.navigationController!.viewControllers.count - popViews - 1]
         self.navigationController?.popToViewController(vc, animated: animated)
    }
}

তারপরে এই পদ্ধতিটি ব্যবহার করুন

self.popViewControllerss(popViews: 2)

ভাল, আমি যা খুঁজছিলাম ধন্যবাদ.
ম্যাডডিসান

6

আপনি এটি ব্যবহার করে দেখতে পারেন: -

[self.navigationController popToViewController:yourViewController animated:YES];

6
//viewIndex = 1;
//viewIndex = 2;
//viewIndex = 3;

// **[viewControllers objectAtIndex: *put here your viewindex number*]

NSArray *viewControllers = [self.navigationController viewControllers];
[self.navigationController popToViewController:[viewControllers objectAtIndex:viewIndex] animated:NO];


4

সুইফ্ট 3 এ , আপনি ন্যাভিগেশন কন্ট্রোলার থেকে এক, দুই বা ততোধিক ভিউ কনট্রোলার পপ করতে পারেন

let viewControllers = self.navigationController!.viewControllers as [UIViewController]
    for aViewController:UIViewController in viewControllers {
        if aViewController.isKind(of: FromWhereYouWantToGoController.self) {
            _ = self.navigationController?.popToViewController(aViewController, animated: true)
        }
    }

এখানে থেকে ইউয়ারওয়ানটটোগোকন্ট্রোলারটি গন্তব্য নিয়ামক। আশা করি এটা সাহায্য করবে.


3

আপনি প্রাথমিক ভিউ কন্ট্রোলারটি (যার কাছে আপনি ফিরে আসতে চান) পাস করতে পারেন এবং তারপরে শেষ দৃশ্যে এই লাইনটি কল করুন:

[self.navigationController popToViewController:yourInitialViewController animated:YES];

এল।


3

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

for (UIViewController *aViewController in self.navigationController.viewControllers) {
   if ([aViewController isKindOfClass:[SMThumbnailViewController class]]) {
      [self.navigationController popToViewController:aViewController animated:YES];
   }
}

2

আপনি রুট ভিউ কন্ট্রোলারে ফিরে যেতে পারেন

[self.navigationController popToRootViewControllerAnimated:YES];

বা, আপনি যে ভিউটিতে পপ করতে চান সেটি যদি প্রথমটি না হয় তবে আপনাকে আপনার আগের দর্শনের ভিউতে আবার পপ করতে হবে উইল অ্যাপয়ার


2

এক্স ভিউ নিয়ন্ত্রণকারীদের ফিরে যেতে আমি এখানে একটি ছোট ফাংশন ব্যবহার করছি:

-(void)backMultiple:(id)data {
    int back = 2; //Default to go back 2 
    int count = [self.navigationController.viewControllers count];

    if(data[@"count"]) back = [data[@"count"] intValue];

    //If we want to go back more than those that actually exist, just go to the root
    if(back+1 > count) {
        [self.navigationController popToRootViewControllerAnimated:YES];
    }
    //Otherwise go back X ViewControllers 
    else {
        [self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:count-(back+1)] animated:YES];
    }
}

2

দুই বা ততোধিক পপিংয়ের (সুইফট 1.2 / এক্সকোড 6.3.1) হিসাবে স্যুইফ্ট সংস্করণ

 var viewControllers = self.navigationController?.viewControllers
 viewControllers?.removeLast()
 viewControllers?.removeLast()
 self.navigationController?.setViewControllers(viewControllers, animated: true)

বা

 var viewControllers = self.navigationController?.viewControllers
 var viewsToPop = 2
 var end = (viewControllers?.count)!
 var start = end - viewsToPop
 viewControllers?.removeRange(Range<Int>(start: start, end: end))
 self.navigationController?.setViewControllers(viewControllers, animated: true)

1

আপনি ইউআইভিউউকন্ট্রোলারদের স্ট্যাক ব্যবহার করতে পারেন। 1. স্ট্যাকের সমস্ত ভিউকন্ট্রোলারের অ্যারে আনুন। 2. পুরো অ্যারের মাধ্যমে ইটারেট করুন এবং
শ্রেণীর ধরণের সাথে মিল রেখে কাঙ্ক্ষিত ভিউকন্ট্রোলারটি সন্ধান করুন । ৩. ভিউকন্ট্রোলারটি পপ করুন।

func popToSpecificViewC
{
let viewControllers: [UIViewController] = self.navigationController!.viewControllers as [UIViewController];
        for viewController:UIViewController in viewControllers
        {
            if viewController.isKind(of: WelcomeViewC.self)
            {
                _ = self.navigationController?.popToViewController(viewController, animated: true)
            }
        }
}

0

একটি সাধারণ ইউআইএনএভিগেশন কন্ট্রোলার এক্সটেনশন ব্যবহার করে :

extension UINavigationController {
    func popViewControllers(_ count: Int) {
        guard viewControllers.count > count else { return }
        popToViewController(viewControllers[viewControllers.count - count - 1], animated: true)
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.