পপভিউকন্ট্রোলারের জন্য সম্পূর্ণকরণ ব্লক


113

কোনও মডেল ভিউ কন্ট্রোলার ব্যবহার করে বরখাস্ত করার সময় dismissViewController, একটি সমাপ্তি ব্লক সরবরাহ করার বিকল্প রয়েছে। এর জন্য কি সমান সমান popViewController?

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

আমি popViewControllerএকটি UIViewঅ্যানিমেশন ব্লক স্থাপনের চেষ্টা করেছি , যেখানে আমার কাছে একটি সমাপ্তি ব্লকে অ্যাক্সেস রয়েছে। যাইহোক, এটি ভিউতে পপ করা হচ্ছে এমন কিছু অযাচিত পার্শ্ব প্রতিক্রিয়া তৈরি করে।

যদি এ জাতীয় কোনও পদ্ধতি উপলব্ধ না থাকে তবে কিছু কাজের ক্ষেত্রগুলি কী কী?


stackoverflow.com/a/33767837/2774520 আমার মনে হয় এই
পথটি


3
2018 এর জন্য এটি খুব সহজ এবং মান: স্ট্যাকওভারফ্লো.com
43017103

উত্তর:


199

আমি জানি একটি উত্তর দুটি বছর আগে গৃহীত হয়েছে, তবে এই উত্তরটি অসম্পূর্ণ।

আপনি বাক্সের বাইরে যা চাইছেন তা করার কোনও উপায় নেই

এটি প্রযুক্তিগতভাবে সঠিক কারণ UINavigationControllerAPI এর জন্য কোনও বিকল্প দেয় না। তবে কোরএনিমেশন ফ্রেমওয়ার্কটি ব্যবহার করে অন্তর্নিহিত অ্যানিমেশনটিতে একটি সমাপ্তি ব্লক যুক্ত করা সম্ভব:

[CATransaction begin];
[CATransaction setCompletionBlock:^{
    // handle completion here
}];

[self.navigationController popViewControllerAnimated:YES];

[CATransaction commit];

শেষের মাধ্যমে ব্যবহৃত অ্যানিমেশনটির সাথে সাথেই সমাপ্তি ব্লক কল করা হবে popViewControllerAnimated:। এই কার্যকারিতা আইওএস 4 সাল থেকে উপলব্ধ।


5
আমি এটিকে সুইফটে ইউআইএনএভিগেশন কন্ট্রোলারের একটি এক্সটেনশনে রেখেছি:extension UINavigationController { func popViewControllerWithHandler(handler: ()->()) { CATransaction.begin() CATransaction.setCompletionBlock(handler) self.popViewControllerAnimated(true) CATransaction.commit() } }
আরবিটুর

1
আমার পক্ষে কাজ করছে বলে মনে হচ্ছে না, যখন আমি বরখাস্ত ভিউকন্ট্রোলারের উপর সম্পূর্ণতা করি, দৃশ্যটি এটি উপস্থাপন করছিল তা দেখার শ্রেণিবদ্ধের অংশ। আমি যখন CATransaction দিয়ে একই কাজ করি, তখন আমি একটি সতর্কতা পেয়েছি যে দর্শনটি ভিউয়ের ক্রমবিন্যাসের অংশ নয়।
moger777

1
ঠিক আছে, আপনার কাজগুলি দেখে মনে হচ্ছে যদি আপনি শুরু এবং সমাপ্তি অবরুদ্ধটিকে বিপরীত করেন। ডাউন ভোটের জন্য দুঃখিত তবে স্ট্যাক ওভারফ্লো আমাকে পরিবর্তন করতে দেবে না :(
moger777

7
হ্যাঁ, এটি দুর্দান্ত লাগবে বলে মনে হয়েছিল, তবে এটি কাজ করে না (অন্তত আইওএস 8 এ)। সমাপ্তি ব্লক অবিলম্বে কল করা হচ্ছে। ইউআইভিউ স্টাইল অ্যানিমেশনগুলির সাথে মূল অ্যানিমেশনগুলির মিশ্রণের কারণে সম্ভবত।
আটকে

5
এটি কাজ করে না
durazno

51

জন্য iOS9 স্যুইফ্ট সংস্করণ - (আগের সংস্করণের জন্য পরীক্ষা করা ছিল) একটি যাদুমন্ত্র মত কাজ করে। এই উত্তরের ভিত্তিতে

extension UINavigationController {    
    func pushViewController(viewController: UIViewController, animated: Bool, completion: () -> ()) {
        pushViewController(viewController, animated: animated)

        if let coordinator = transitionCoordinator() where animated {
            coordinator.animateAlongsideTransition(nil) { _ in
                completion()
            }
        } else {
            completion()
        }
    }

    func popViewController(animated: Bool, completion: () -> ()) {
        popViewControllerAnimated(animated)

        if let coordinator = transitionCoordinator() where animated {
            coordinator.animateAlongsideTransition(nil) { _ in
                completion()
            }
        } else {
            completion()
        }
    }
}

অ্যানিমেটেড না হলে কাজ করবে না, এটি সঠিকভাবে করার জন্য পরবর্তী রানলুপে সম্পূর্ণ করা উচিত।
rshev

@ রাশেভ পরের রানলুপে কেন?
বেন সিনক্লেয়ার

@ অ্যানডির সাথে আমি যা পরীক্ষা করে দেখেছি তা থেকে, সেই মুহূর্তে এখনও কিছু প্রচার করা হয়নি। এটির সাথে পরীক্ষা করার চেষ্টা করুন, এটি আপনার জন্য কীভাবে কাজ করে তা শুনতে ভালোবাসুন।
rshev

@ শেভেভ আমার মনে হয় আমার আগেও এটি ছিল, আমাকে ডাবল চেক করতে হবে। বর্তমান পরীক্ষা ঠিক আছে।
বেন সিনক্লেয়ার

1
@ ল্যান্স সামারিয়া আমি ভিউডিডডিস্পিয়ার ব্যবহার করার পরামর্শ দিই। নাবারটি পাওয়া যায় কিনা তা পরীক্ষা করুন - নাভবারে এটি প্রদর্শিত হয়নি, তাই এটি পপ করা হয়েছিল। if (self.navicationController == nil) your আপনার ক্রিয়াটি ট্রিগার করুন
Hot

32

আমি @ জোরিসক্লুভারের উত্তর Swiftদিয়ে এক্সটেনশানগুলি সহ একটি সংস্করণ তৈরি করেছি ।

এনিমেশন pushএবং উভয়ের জন্য সম্পন্ন হওয়ার পরে এটি একটি সমাপ্তি বন্ধের ডাক দেবে pop

extension UINavigationController {
    func popViewControllerWithHandler(completion: ()->()) {
        CATransaction.begin()
        CATransaction.setCompletionBlock(completion)
        self.popViewControllerAnimated(true)
        CATransaction.commit()
    }
    func pushViewController(viewController: UIViewController, completion: ()->()) {
        CATransaction.begin()
        CATransaction.setCompletionBlock(completion)
        self.pushViewController(viewController, animated: true)
        CATransaction.commit()
    }
}

আমার জন্য, আইওএস 8.4-এ, ওবিজেসি-তে লিখিত ব্লকটি অ্যানিমেশনটির নিচে থেকে অর্ধেক আগুন জ্বলছে। যদি সুইফটে লিখিত হয় (8.4) সঠিক মুহুর্তে এটি কি সত্যই আগুন দেয়?
জুলিয়ান এফ ওয়েইনার্ট 19

@ আরবিটুর সমাপ্তি ব্লকটি কল করার পরে popViewControllerবা প্রকৃতপক্ষে ডেকে আনা হয়েছে pushViewController, তবে আপনি যদি শীর্ষস্থানীয় ভিউকন্ট্রোলার ঠিক তার পরে পরীক্ষা করেন তবে আপনি দেখতে পাবেন যে এটি এখনও পুরানো, ঠিক যেমন popবা pushকখনও হয়নি ...
বোগদান রাজন

@ বোগদান রাজ্জওয়ান ঠিক কি পরে? অ্যানিমেশনটি শেষ হয়ে গেলে কি আপনার সমাপ্তি ক্লোজারটি কল হবে?
আরবিটুর

17

সুইট 4.1

extension UINavigationController {
func pushToViewController(_ viewController: UIViewController, animated:Bool = true, completion: @escaping ()->()) {
    CATransaction.begin()
    CATransaction.setCompletionBlock(completion)
    self.pushViewController(viewController, animated: animated)
    CATransaction.commit()
}

func popViewController(animated:Bool = true, completion: @escaping ()->()) {
    CATransaction.begin()
    CATransaction.setCompletionBlock(completion)
    self.popViewController(animated: animated)
    CATransaction.commit()
}

func popToViewController(_ viewController: UIViewController, animated:Bool = true, completion: @escaping ()->()) {
    CATransaction.begin()
    CATransaction.setCompletionBlock(completion)
    self.popToViewController(viewController, animated: animated)
    CATransaction.commit()
}

func popToRootViewController(animated:Bool = true, completion: @escaping ()->()) {
    CATransaction.begin()
    CATransaction.setCompletionBlock(completion)
    self.popToRootViewController(animated: animated)
    CATransaction.commit()
}
}

17

আমারো একই ইস্যু ছিল. এবং যেহেতু আমাকে এটি একাধিক অনুষ্ঠানে ব্যবহার করতে হয়েছিল, এবং সমাপ্তি ব্লকগুলির শৃঙ্খলে, আমি একটি ইউআইএনএভিগেশন কন্ট্রোলার সাবক্লাসে এই জেনেরিক সমাধানটি তৈরি করেছি:

- (void) navigationController:(UINavigationController *) navigationController didShowViewController:(UIViewController *) viewController animated:(BOOL) animated {
    if (_completion) {
        dispatch_async(dispatch_get_main_queue(),
        ^{
            _completion();
            _completion = nil;
         });
    }
}

- (UIViewController *) popViewControllerAnimated:(BOOL) animated completion:(void (^)()) completion {
    _completion = completion;
    return [super popViewControllerAnimated:animated];
}

অভিমানী

@interface NavigationController : UINavigationController <UINavigationControllerDelegate>

এবং

@implementation NavigationController {
    void (^_completion)();
}

এবং

- (id) initWithRootViewController:(UIViewController *) rootViewController {
    self = [super initWithRootViewController:rootViewController];
    if (self) {
        self.delegate = self;
    }
    return self;
}

1
আমি এই সমাধানটি সত্যিই পছন্দ করি, আমি এটি একটি বিভাগ এবং একটি সম্পর্কিত বস্তুর সাথে চেষ্টা করে যাচ্ছি।
স্প্যান্সলে

@ স্প্যানলে আপনার এই পোডটি প্রকাশ করা দরকার :)
k06a

সুইফ্ট সংস্করণ -> স্ট্যাকওভারফ্লো.com
উইল

15

আপনি বাক্সের বাইরে যা চাইছেন তা করার কোনও উপায় নেই। যেমন একটি এনএভি স্ট্যাক থেকে একটি ভিউ কন্ট্রোলার পপ করার জন্য একটি সমাপ্তি ব্লক সহ কোনও পদ্ধতি নেই।

আমি কি করতে হবে যুক্তি করা হয় viewDidAppear। দৃশ্যটি পর্দায় আসা শেষ হয়ে গেলে এটি ডাকা হবে। এটিকে ভিউ কন্ট্রোলারের উপস্থিত হওয়ার জন্য সমস্ত ভিন্ন দৃশ্যের জন্য ডাকা হবে, তবে এটি ঠিক হওয়া উচিত।

অথবা আপনি অনুরূপ কাজ করতে UINavigationControllerDelegateপদ্ধতিটি ব্যবহার করতে পারেন navigationController:didShowViewController:animated:। যখন নেভিগেশন নিয়ামক কোনও ভিউ কন্ট্রোলারকে ধাক্কা বা পপিং শেষ করেন তখন এটিকে বলা হয়।


আমি এই চেষ্টা করেছি। আমি 'মুছে ফেলা সারি সূচিকাগুলি'র একটি অ্যারে সংরক্ষণ করছিলাম এবং যখনই দৃশ্যটি উপস্থিত হবে, কিছু অপসারণ করা দরকার কিনা তা পরীক্ষা করে দেখছি। এটি দ্রুত অযৌক্তিকভাবে বেড়েছে তবে আমি এটি অন্য শট দিতে পারি। আমি ভাবছি কেন অ্যাপল এটিকে একটি রূপান্তর হিসাবে সরবরাহ করে তবে অন্যটি নয়?
বেন প্যাকার্ড

1
এটি শুধুমাত্র খুব নতুন dismissViewController। এটা আসতে হবে popViewController। একটি রাডার ফাইল করুন :-)।
ম্যাটজগ্লোলোয়

গুরুতরভাবে যদিও, একটি রাডার ফাইল করুন। লোকেরা যদি এটি জিজ্ঞাসা করে তবে এটি এটিকে তৈরি করার সম্ভাবনা বেশি।
ম্যাটজগ্লোলোয়

1
এটি চাওয়ার সঠিক জায়গা place শ্রেণীবদ্ধের জন্য 'বৈশিষ্ট্য' হওয়ার বিকল্প রয়েছে।
ম্যাটজগ্লোলোয়

3
এই উত্তরটি সম্পূর্ণ সঠিক নয়। আপনি নতুন-স্টাইলের মতো ব্লকটি আর পছন্দ -dismissViewController:animated:completionBlock:করতে পারবেন না তবে আপনি নেভিগেশন নিয়ন্ত্রকের প্রতিনিধিটির মাধ্যমে অ্যানিমেশনটি পেতে পারেন। অ্যানিমেশনটি সম্পূর্ণ হওয়ার পরে, ডেলিগেটকে -navigationController:didShowViewController:animated:ডাকা হবে এবং আপনি যা প্রয়োজন সেখানে করতে পারেন right
জেসন কোকো

13

সঠিকভাবে অ্যানিমেশন সহ বা ছাড়া কাজ করা এবং এর মধ্যে রয়েছে popToRootViewController:

 // updated for Swift 3.0
extension UINavigationController {

  private func doAfterAnimatingTransition(animated: Bool, completion: @escaping (() -> Void)) {
    if let coordinator = transitionCoordinator, animated {
      coordinator.animate(alongsideTransition: nil, completion: { _ in
        completion()
      })
    } else {
      DispatchQueue.main.async {
        completion()
      }
    }
  }

  func pushViewController(viewController: UIViewController, animated: Bool, completion: @escaping (() ->     Void)) {
    pushViewController(viewController, animated: animated)
    doAfterAnimatingTransition(animated: animated, completion: completion)
  }

  func popViewController(animated: Bool, completion: @escaping (() -> Void)) {
    popViewController(animated: animated)
    doAfterAnimatingTransition(animated: animated, completion: completion)
  }

  func popToRootViewController(animated: Bool, completion: @escaping (() -> Void)) {
    popToRootViewController(animated: animated)
    doAfterAnimatingTransition(animated: animated, completion: completion)
  }
}

কোনও বিশেষ কারণ আপনি কেন completion()async কল করছেন ?
লিবিয়াথন

1
যখন সমন্বয়কের সাথে অ্যানিমেট করা completionএকই রানলুপে কখনই চালিত হয় না। completionঅ্যানিমেটেড না হওয়ার পরে এই গ্যারান্টিগুলি কখনই একই রানলুপে চলবে না। এই ধরণের অসঙ্গতি না রাখাই ভাল।
আরশেভ

11

@ হটজার্ডের উত্তরের ভিত্তিতে, যখন আপনি চান কেবল কোডের কয়েকটি লাইন। দ্রুত এবং সহজ।

সুইফট 4 :

_ = self.navigationController?.popViewController(animated: true)
self.navigationController?.transitionCoordinator.animate(alongsideTransition: nil) { _ in
    doWhatIWantAfterContollerHasPopped()
}

6

2018 এর জন্য ...

যদি আপনার এই ...

    navigationController?.popViewController(animated: false)
    // I want this to happen next, help! ->
    nextStep()

এবং আপনি একটি সমাপ্তি যোগ করতে চান ...

    CATransaction.begin()
    navigationController?.popViewController(animated: true)
    CATransaction.setCompletionBlock({ [weak self] in
       self?.nextStep() })
    CATransaction.commit()

এটা যে সহজ।

সহজ টিপস ...

হ্যান্ডি popToViewControllerকলের জন্য এটি একই চুক্তি ।

একটি সাধারণ বিষয় হ'ল আপনার কাছে একটি জিলিয়ন স্ক্রিনের একটি বোর্ডিং স্ট্যাক রয়েছে। অবশেষে সম্পন্ন হয়ে গেলে, আপনি আপনার "বেস" স্ক্রিনে ফিরে সমস্ত পথে যান এবং তারপরে অ্যাপ্লিকেশনটি ফায়ার করুন।

সুতরাং "বেস" স্ক্রিনে, "সমস্ত পথে ফিরে যেতে", popToViewController(self

func onboardingStackFinallyComplete() {
    
    CATransaction.begin()
    navigationController?.popToViewController(self, animated: false)
    CATransaction.setCompletionBlock({ [weak self] in
        guard let self = self else { return }
        .. actually launch the main part of the app
    })
    CATransaction.commit()
}

5

উপস্থাপনিত ভিউ কন্ট্রোলারে ভিডিডিডিস্পিয়ার পদ্ধতিটি কল করার পরে সমাপ্তি ব্লকটি ডাকা হয়, সুতরাং পপড ভিউ কন্ট্রোলারের ভিউডিডডিস্পিয়ার পদ্ধতিতে কোড স্থাপনের ফলে সমাপ্তি ব্লকের মতোই কাজ করা উচিত।


অবশ্যই - ততক্ষণে আপনাকে সেই সমস্ত ক্ষেত্রে পরিচালনা করতে হবে যেখানে অন্য কোনও কারণে দৃশ্যটি অদৃশ্য হয়ে যাচ্ছে।
বেন প্যাকার্ড 21

1
@ বেনপ্যাকার্ড, হ্যাঁ, এবং আপনি যে উত্তরটি স্বীকার করেছেন সেটিতে এটি ডুডআইপিয়ারে রাখার জন্য একই কথা।
rdelmar

5

3 টি উত্তর, এই উত্তরটির জন্য ধন্যবাদ: https://stackoverflow.com/a/28232570/3412567

    //MARK:UINavigationController Extension
extension UINavigationController {
    //Same function as "popViewController", but allow us to know when this function ends
    func popViewControllerWithHandler(completion: @escaping ()->()) {
        CATransaction.begin()
        CATransaction.setCompletionBlock(completion)
        self.popViewController(animated: true)
        CATransaction.commit()
    }
    func pushViewController(viewController: UIViewController, completion: @escaping ()->()) {
        CATransaction.begin()
        CATransaction.setCompletionBlock(completion)
        self.pushViewController(viewController, animated: true)
        CATransaction.commit()
    }
}

4

নির্দিষ্ট একটিতে পপ করতে ontচ্ছিক ভিউকন্ট্রোলার প্যারামিটার সহ সুইফট 4 সংস্করণ।

extension UINavigationController {
    func pushViewController(viewController: UIViewController, animated: 
        Bool, completion: @escaping () -> ()) {

        pushViewController(viewController, animated: animated)

        if let coordinator = transitionCoordinator, animated {
            coordinator.animate(alongsideTransition: nil) { _ in
                completion()
            }
        } else {
            completion()
        }
}

func popViewController(viewController: UIViewController? = nil, 
    animated: Bool, completion: @escaping () -> ()) {
        if let viewController = viewController {
            popToViewController(viewController, animated: animated)
        } else {
            popViewController(animated: animated)
        }

        if let coordinator = transitionCoordinator, animated {
            coordinator.animate(alongsideTransition: nil) { _ in
                completion()
            }
        } else {
            completion()
        }
    }
}

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

4

এই উত্তরের উপর ভিত্তি করে সুইফট 4 সংস্করণটি পরিষ্কার করা হয়েছে ।

extension UINavigationController {
    func pushViewController(_ viewController: UIViewController, animated: Bool, completion: @escaping () -> Void) {
        self.pushViewController(viewController, animated: animated)
        self.callCompletion(animated: animated, completion: completion)
    }

    func popViewController(animated: Bool, completion: @escaping () -> Void) -> UIViewController? {
        let viewController = self.popViewController(animated: animated)
        self.callCompletion(animated: animated, completion: completion)
        return viewController
    }

    private func callCompletion(animated: Bool, completion: @escaping () -> Void) {
        if animated, let coordinator = self.transitionCoordinator {
            coordinator.animate(alongsideTransition: nil) { _ in
                completion()
            }
        } else {
            completion()
        }
    }
}

2

ইউআইএনএভিগেশন কন্ট্রোলার উইথ কমপ্লিশন ব্লক নামে একটি পড রয়েছে যা একটি ইউআইএনএভিগেশন কন্ট্রোলারকে ধাক্কা দেওয়া এবং পপ করার সময় উভয়ই একটি সমাপ্তি ব্লকের জন্য সমর্থন যোগ করে।


2

2020 সুইফ্ট 5.1 উপায়

এই সমাধান গ্যারান্টি দেয় যে পপভিউকন্ট্রোলার সম্পূর্ণরূপে সমাপ্ত হওয়ার পরে সমাপ্তি কার্যকর করা হয়। আপনি সম্পূর্ণ নেভিগেশনকন্ট্রোলারের উপর অন্য অপারেশন করে এটি পরীক্ষা করতে পারেন: ইউআইএনএভিগেশন কন্ট্রোলার উপরে অন্য সমস্ত সমাধানগুলিতে এখনও পপভিউকন্ট্রোলার ক্রিয়াকলাপে ব্যস্ত এবং সাড়া দেয় না।

public class NavigationController: UINavigationController, UINavigationControllerDelegate
{
    private var completion: (() -> Void)?

    override init(rootViewController: UIViewController) {
        super.init(rootViewController: rootViewController)
        delegate = self
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    public override func navigationController(_ navigationController: UINavigationController, didShow viewController: UIViewController, animated: Bool)
    {
        if self.completion != nil {
            DispatchQueue.main.async(execute: {
                self.completion?()
                self.completion = nil
            })
        }
    }

    func popViewController(animated: Bool, completion: @escaping () -> Void) -> UIViewController?
    {
        self.completion = completion
        return super.popViewController(animated: animated)
    }
}

1

কেবল সম্পূর্ণতার জন্য, আমি ব্যবহারের জন্য একটি উদ্দেশ্য-সি বিভাগ তৈরি করে রেখেছি:

// UINavigationController+CompletionBlock.h

#import <UIKit/UIKit.h>

@interface UINavigationController (CompletionBlock)

- (UIViewController *)popViewControllerAnimated:(BOOL)animated completion:(void (^)()) completion;

@end
// UINavigationController+CompletionBlock.m

#import "UINavigationController+CompletionBlock.h"

@implementation UINavigationController (CompletionBlock)

- (UIViewController *)popViewControllerAnimated:(BOOL)animated completion:(void (^)()) completion {
    [CATransaction begin];
    [CATransaction setCompletionBlock:^{
        completion();
    }];

    UIViewController *vc = [self popViewControllerAnimated:animated];

    [CATransaction commit];

    return vc;
}

@end

1

আমি একটি ব্লক ব্যবহার করে নির্ভুলতার সাথে ঠিক এটি অর্জন করেছি। আমি চেয়েছিলাম যে আমার প্রাপ্ত ফলাফলগুলি নিয়ামকটি মডেল দৃশ্যে যুক্ত হওয়া সারিটি প্রদর্শন করবে, এটি একবারে সম্পূর্ণরূপে স্ক্রিনটি ছেড়ে চলে গেছে, যাতে ব্যবহারকারী পরিবর্তনটি ঘটতে পারে। মডেল ভিউ কন্ট্রোলার দেখানোর জন্য দায়বদ্ধ সেগের প্রস্তুতির জন্য, আমি যখন মডেলটি অদৃশ্য হয়ে যায় তখন আমি যে ব্লকটি সম্পাদন করতে চাই তা সেট করি। এবং মডেল ভিউ কন্ট্রোলারে আমি ভিউডিডডিসাপিয়ারকে ওভাররাইড করি এবং তারপরে ব্লকটি কল করি। আমি যখন মডেলটি প্রদর্শিত হতে চলেছে তখন আপডেটগুলি শেষ করতে শুরু করি এবং অদৃশ্য হয়ে গেলে আপডেটগুলি শেষ হয়, তবে এটি হ'ল আমি কোনও এনএসফ্যাচড্রয়েস্টসকন্ট্রোলার ব্যবহার করছি তবে আপনি ব্লকের ভিতরে যা খুশি তা করতে পারেন।

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
    if([segue.identifier isEqualToString:@"addPassword"]){

        UINavigationController* nav = (UINavigationController*)segue.destinationViewController;
        AddPasswordViewController* v = (AddPasswordViewController*)nav.topViewController;

...

        // makes row appear after modal is away.
        [self.tableView beginUpdates];
        [v setViewDidDissapear:^(BOOL animated) {
            [self.tableView endUpdates];
        }];
    }
}

@interface AddPasswordViewController : UITableViewController<UITextFieldDelegate>

...

@property (nonatomic, copy, nullable) void (^viewDidDissapear)(BOOL animated);

@end

@implementation AddPasswordViewController{

...

-(void)viewDidDisappear:(BOOL)animated{
    [super viewDidDisappear:animated];
    if(self.viewDidDissapear){
        self.viewDidDissapear(animated);
    }
}

@end

1

আপনার কোডে পরবর্তী এক্সটেনশনটি ব্যবহার করুন: (সুইফট 4)

import UIKit

extension UINavigationController {

    func popViewController(animated: Bool = true, completion: @escaping () -> Void) {
        CATransaction.begin()
        CATransaction.setCompletionBlock(completion)
        popViewController(animated: animated)
        CATransaction.commit()
    }

    func pushViewController(_ viewController: UIViewController, animated: Bool = true, completion: @escaping () -> Void) {
        CATransaction.begin()
        CATransaction.setCompletionBlock(completion)
        pushViewController(viewController, animated: animated)
        CATransaction.commit()
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.