التحقق مما إذا كان UIViewController على وشك الظهور من مكدس التنقل؟

StackOverflow https://stackoverflow.com/questions/642312

سؤال

أحتاج إلى معرفة متى تكون وحدة التحكم في العرض الخاصة بي على وشك الانطلاق من مكدس التنقل حتى أتمكن من تنفيذ الإجراء.

لا يمكنني استخدام -viewWillDisappear، لأنه يتم استدعاؤه عند نقل وحدة التحكم في العرض خارج الشاشة لأي سبب (مثل دفع وحدة تحكم العرض الجديدة إلى الأعلى).

أحتاج على وجه التحديد إلى معرفة متى تكون وحدة التحكم على وشك أن تظهر بنفسها.

أي أفكار ستكون رائعة، شكرا مقدما.

هل كانت مفيدة؟

المحلول

وأنا لا أعتقد أن هناك رسالة واضحة لهذا، ولكن هل يمكن أن فئة فرعية UINavigationController وتجاوز - popViewControllerAnimated (على الرغم من أنني لم يحاكم هذا من قبل نفسي)

وبدلا من ذلك، إذا لم تكن هناك إشارات أخرى إلى وحدة تحكم الرأي، يمكنك إضافة إلى ه - dealloc

نصائح أخرى

وتجاوز أسلوب viewWillDisappear في VC المقدمة، ثم تحقق من العلم isMovingFromParentViewController داخل تجاوز والقيام منطق محدد. في حالتي أنا إخفاء شريط أدوات التحكم والملاحة. لا يزال يتطلب أن VC الخاص بك عرض نفهم أن دفعت لذلك على الرغم من ذلك لم يكن مثاليا.

وحاول تجاوز <لأ href = "https://developer.apple.com/library/ios/documentation/uikit/reference/UIViewController_Class/Reference/Reference.html#//apple_ref/occ/instm/UIViewController/willMoveToParentViewController: "يختلط =" noreferrer "> willMoveToParentViewController: (وبدلا من viewWillDisappear:) في فئة فرعية مخصصة من UIViewController.

<اقتباس فقرة>   

ودعا فقط قبل إضافة وحدة تحكم الرأي أو إزالتها من وحدة تحكم عرض الحاوية.

- (void)willMoveToParentViewController:(UIViewController *)parent
{
    [super willMoveToParentViewController:parent];
    if (!parent) {
        // `self` is about to get popped.
    }
}

لحسن الحظ، بحلول الوقت الذي يتم فيه استدعاء الأسلوب viewWillDisappear، تكون وحدة التحكم viewController قد تمت إزالتها بالفعل من المكدس، لذلك نعلم أن وحدة التحكم viewController قد ظهرت لأنها لم تعد موجودة في المكدس. self.navigationController.viewControllers

سويفت 4

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)

    if let nav = self.navigationController {
        let isPopping = !nav.viewControllers.contains(self)
        if isPopping {
            // popping off nav
        } else {
            // on nav, not popping off (pushing past, being presented over, etc.)
        }
    } else {
        // not on nav at all
    }
}

الكود الأصلي

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    if ((self.navigationController) && 
        (![self.navigationController.viewControllers containsObject:self])) {
        NSLog(@"I've been popped!");
    }
}

وهذا هو العمل بالنسبة لي.

- (void)viewDidDisappear:(BOOL)animated
{
    if (self.parentViewController == nil) {
        NSLog(@"viewDidDisappear doesn't have parent so it's been popped");
        //release stuff here
    } else {
        NSLog(@"PersonViewController view just hidden");
    }
}

ويمكنك قبض عليه هنا.

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {

    if (viewController == YourAboutToAppearController) {
            // do something
    }
}

وهذا سوف النار قبل عرض عرض جديد. هو لا أحد يتحرك حتى الان. يمكنني استخدام كل الوقت للقيام السحر أمام NavigationController أبله. يمكنك تعيين عناوين وعناوين زر والقيام بكل ما هناك.

ولدي نفس المشكلة. حاولت مع viewDisDisappear، ولكن ليس لدي وظيفة الحصول على استدعاء :( (لا أعرف لماذا، ربما لأن كل ما عندي من VC هو UITableViewController). على اقتراح من أليكس يعمل بشكل جيد ولكنه فشل إذا تم عرض تحكم الملاحة الخاص تحت المزيد من علامة التبويب. في هذه الحالة، كل فكس وحدات تحكم الملاحة الخاص بك لديها navigationController كما UIMoreNavigationController، وليس وحدة تحكم الملاحة قمت subclassed، لذلك لن يتم إشعارك بها الملاحة عندما VC على وشك أن برزت.
واخيرا، أنا حل المشكلة مع فئة من UINavigationController، مجرد كتابة - (UIViewController *) popViewControllerAnimated: (BOOL) الرسوم المتحركة

- (UIViewController *)popViewControllerAnimated:(BOOL)animated{
   NSLog(@"UINavigationController(Magic)");
   UIViewController *vc = self.topViewController;
   if ([vc respondsToSelector:@selector(viewControllerWillBePopped)]) {
      [vc performSelector:@selector(viewControllerWillBePopped)];
   }
   NSArray *vcs = self.viewControllers;
   UIViewController *vcc = [vcs objectAtIndex:[vcs count] - 2];
   [self popToViewController:vcc animated:YES];
   return vcc;}

وكان يعمل بشكل جيد بالنسبة لي: D

وحاولت هذه:

- (void) viewWillDisappear:(BOOL)animated {
    // If we are disappearing because we were removed from navigation stack
    if (self.navigationController == nil) {
        // YOUR CODE HERE
    }

    [super viewWillDisappear:animated];
}

والفكرة هي أنه في تفرقع، يتم تعيين navigationController وحدة تحكم طريقة العرض إلى لا شيء. حتى إذا كان الرأي أن تختفي، وأنه يعد لديها navigationController، وخلص إلى أن برزت ذلك. (قد لا تعمل في سيناريوهات أخرى).

لا يمكن أن يشهدوا أن سوف يطلق viewWillDisappear على تفرقع، كما لم يتم ذكر ذلك في مستندات. حاولت ذلك عندما كان الرأي رأي كبار، وتحت رأي كبار - وعملت في كل من

وحظا سعيدا، عوديد.

ويمكنك استخدام هذا واحد:

if(self.isMovingToParentViewController)
{
    NSLog(@"Pushed");
}
else
{
    NSLog(@"Popped");
}

وUINavigationController الفئة الفرعية وتجاوز popViewController:

سويفت 3

protocol CanPreventPopProtocol {
    func shouldBePopped() -> Bool
}

class MyNavigationController: UINavigationController {
    override func popViewController(animated: Bool) -> UIViewController? {
        let viewController = self.topViewController

        if let canPreventPop = viewController as? CanPreventPopProtocol {
            if !canPreventPop.shouldBePopped() {
                return nil
            }
        }
        return super.popViewController(animated: animated)
    }

    //important to prevent UI thread from freezing
    //
    //if popViewController is called by gesture recognizer and prevented by returning nil
    //UI will freeze after calling super.popViewController
    //so that, in order to solve the problem we should not return nil from popViewController
    //we interrupt the call made by gesture recognizer to popViewController through
    //returning false on gestureRecognizerShouldBegin
    //
    //tested on iOS 9.3.2 not others
    func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
        let viewController = self.topViewController

        if let canPreventPop = viewController as? CanPreventPopProtocol {
            if !canPreventPop.shouldBePopped() {
                return false
            }
        }

        return true
    }

}

وربما يمكن استخدام شريط التصفح UINavigationBarDelegate ل: طريقة بروتوكول shouldPopItem

.

ومحاولة جعل هذا الاختيار في viewwilldisappear إذا ([self.navigationController.viewControllers indexOfObject: النفس] == NSNotFound) { // وHAPPEND ظهرت من وجهة النظر هذه. }

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