سؤال

أنا أستخدم التطبيق القائم على التنقل. أدفع First ViewController إلى Second ViewController ومن الثاني ViewController إلى Third ViewController. الآن أريد أن أبدأ من ViewController الثالث إلى First ViewController.I أنا أقوم بهذه المهمة باستخدام الرمز أدناه ولكن تحطمت طلبي.

من فضلك أي شخص يعطيني بعض الإرشادات المناسبة. لا يمكنني استخدام POP إلى RootViewController لأنه مختلف ViewController. شكرا لك مقدما...

في ثالث ViewControler لقد كتبت هذا:

FirstViewCtr *x=[[FirstViewCtr alloc] initWithNibName:@"FirstViewCtr" bundle:nil];
[self.navigationController popToViewController:x animated:NO];
هل كانت مفيدة؟

المحلول

من خلال كتابة السطر الأول ، تحصل على فهارس جميع وحدات التحكم في العرض ومن السطر الثاني ستصل إلى وجهتك.

NSArray *array = [self.navigationController viewControllers];

[self.navigationController popToViewController:[array objectAtIndex:2] animated:YES];

نصائح أخرى

نهج أكثر أمانًا:

- (void)turnBackToAnOldViewController{

    for (UIViewController *controller in self.navigationController.viewControllers) {

        //Do not forget to import AnOldViewController.h
        if ([controller isKindOfClass:[AnOldViewController class]]) { 

            [self.navigationController popToViewController:controller
                                                  animated:YES];
            return;
        }
    }
}

طريق Swifty:

     let dashboardVC = navigationController!.viewControllers.filter { $0 is YourViewController }.first!
     navigationController!.popToViewController(dashboardVC, animated: true)
[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:1] animated:YES];

غالبًا ما يكون من المهم القيام بذلك من أعلى المكدس ، هكذا:

- (void)popToLast:(Class)aClass
{
    for (int i=self.navigationController.viewControllers.count-1; i>=0; i--)
    {
        UIViewController *vc = self.navigationController.viewControllers[i];
        if ([vc isKindOfClass:aClass])
        {
            [self.navigationController popToViewController:vc animated:YES];
            break;
        }
    }
}

وأنت تسمي ذلك

popToLast:[SomeViewController class];
- (void) RetunToSpecificViewController{

   for (UIViewController *controller in self.navigationController.viewControllers)
    {
           if ([controller isKindOfClass:[AnOldViewController class]])
           {
            //Do not forget to import AnOldViewController.h

                       [self.navigationController popToViewController:controller
                                                             animated:YES];
                        break;
            }
    }
}

سريع وآمن سريع 3 الإصدار:

if let vc = navigationController.viewControllers.filter({ $0 is SpecificViewControllerClass }).first {
  navigationController.popToViewController(vc, animated: true)
}

ينشئ الرمز مثيلًا جديدًا من العرض الذي لم يتم دفعه أبدًا إلى المكدس ، ثم يحاول العودة إلى وحدة التحكم هذه.

إذا كنت تعود إلى وحدة التحكم في عرض الجذر ، فيمكنك استخدامها popToRootViewControllerAnimated:

إذا كنت تبرز مسافة معروفة يمكنك الاتصال بها popViewControllerAnimated: أكثر من مرة. في مثالك ، سيكون ذلك 2 وحدات تحكم حتى للمكالمات. يمكنك أن تفعل الشيء نفسه من خلال النظر فيه viewControllers لوحدة التحكم 2 من النهاية وظهرت إليها.

الاقتراحات أعلاه هي إصلاحات سريعة. سيكون سيناريو أفضل الممارسات هو تمرير وحدة التحكم التي تريد العودة إليها إلى كل وحدة تحكم متتالية تدفعها. يمر أولاً إلى الثانية ، يمر الثاني الذي يشير إلى الملوثات العضوية الثابتة الثالثة والثالثة إلى المرجع الذي تم تمريره ، وهو الأول.

في الواقع ، أنت تقوم بإنشاء وحدة تحكم جذرية مؤقتة. يمكنك فئة فرعية UINavigationController وإضافة أ temporaryRoot الممتلكات و popToTemporaryRootViewControllerAnimated: الطريقة التي من شأنها أن تنبثق إلى جذرك المؤقت ومسحه. عندما يدفع الثواني أولاً ، فإنه سيضع نفسه أيضًا كجذر مؤقت بحيث لا يتعين على كل وحدة تحكم في المكدس تمرير مرجع حولها. سيكون عليك إضافة بعض الشيكات الإضافية إلى عدم التأكد من عدم ظهور الجاذبية المؤقتة دون مسحها.

بعد الكثير من الجهد قام شخص ما بإنشاء تمديد سريع للعودة إلى وحدة تحكم عرض معينة في Swift 3.0.

extension UINavigationController {

    func backToViewController(viewController: Swift.AnyClass) {

            for element in viewControllers as Array {
                if element.isKind(of: viewController) {
                    self.popToViewController(element, animated: true)
                break
            }
        }
    }
}

الطريقة الدعوة:

 self.navigationController?.backToViewController(viewController: YourViewController.self)

نفذت واختبارها سويفت 3.0

فيما يلي الطريقة التي يمكن أن تكون مفيدة للانتقال إلى أي وحدة تحكم عرض محددة:

func poptoSpecificVC(viewController : Swift.AnyClass){
        let viewControllers: [UIViewController] = self.navigationController!.viewControllers
        for aViewController in viewControllers {
            if aViewController.isKind(of: viewController) {
                self.navigationController!.popToViewController(aViewController, animated: true)
                break;
            }
        }
    }

الاستخدام:

self.poptoSpecificVC(viewController: createIntervalVC.self)

اعتقد انه .filter({...}).first أبطأ قليلاً من .first(where: {...}). كما يمكن كتابة هذا بشكل أكثر دقة لمعالجة UiviewControllers فقط.

extension UINavigationController {
    func popToController<T: UIViewController>(_ type: T.Type, animated: Bool) {
        if let vc = viewControllers.first(where: { $0 is T }) {
            popToViewController(vc, animated: animated)
        }
    }
    func popToControllerOrToRootControllerIfNotInTheStack<T: UIViewController>(_ type: T.Type, animated: Bool) {
        if let vc = viewControllers.first(where: { $0 is T }) {
            popToViewController(vc, animated: animated)
        } else {
            popToRootViewController(animated: animated)
        }
    }
}

تم تحديثه لـ Swift 3:

تستخدم أدناه رمز بسيط ، للبوب إلى وحدة تحكم عرض محددة ؛

 for vc in self.navigationController!.viewControllers as Array {
          if vc.isKind(of: YourViewControllerName) {
               self.navigationController!.popToViewController(vc, animated: true)
               break
          }
    }

سريع 4 الإصدار

if let viewController = navigationController?.viewControllers.first(where: {$0 is YourViewController}) {
      navigationController?.popToViewController(viewController, animated: false)
}

يمكنك تحديد مرشح آخر على .viewControllers.first حسب حاجتك على سبيل المثال ، دعنا نقول إذا كان لديك نفس kind من أجهزة التحكم في العرض المقيمين في وحدة تحكم التنقل ، ثم يمكنك تحديد شيك إضافي مثل أدناه

  if let viewController = navigationController?.viewControllers.first(where: {
        if let current = $0 as? YourViewController {
             return current.someProperty == "SOME VALUE"
        }
       return false } ) {
            navigationController?.popToViewController(viewController, animated: false)
   }
for controller in self.navigationController!.viewControllers as Array {
        if controller.isKind(of: LoginVC.self) {
            _ =  self.navigationController!.popToViewController(controller, animated: true)
            break
        }
    }

ضع الوظيفة في UIViewController1. يتحقق إذا كان محددًا UIViewController موجود في UINavigationController من ثم popToViewController او اخرى pushViewController

func navigate(_ navVC: AnyClass, pushVC: UIViewController) {
    for obj in self.navigationController!.viewControllers {
        if obj.isMember(of: navVC) {
            self.navigationController!.popToViewController(obj, animated: true)
            return
        }
    }
    self.navigationController!.pushViewController(pushVC, animated: true)
}

يستخدم

self.navigate(ViewController.self, pushVC: self.storyboard?.instantiateViewController(withIdentifier: "ViewController") as! ViewController)

لدي إجابة هنا. هذا هو رمز العمل 100 ٪ ل سويفت> 4.x

كيف يمكنني تشغيل وحدة تحكم العرض المحددة في Swift

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top