'বার' বোতামটি যখন একটি নাবারে টিপানো হয় তখন সনাক্ত করা হচ্ছে


135

ব্যাক বোতামটি (পূর্ববর্তী স্ক্রিনে ফিরে আসা, প্যারেন্ট-ভিউতে ফিরে আসা) বোতামটি যখন একটি নাবারে চাপানো হয় তখন আমাকে কিছু ক্রিয়া সম্পাদন করতে হবে।

ইভেন্টটি ধরতে আমি কোনও পদ্ধতি প্রয়োগ করতে পারি এবং স্ক্রিনটি অদৃশ্য হওয়ার আগে ডেটা থামিয়ে দিতে এবং সংরক্ষণ করতে কিছু ক্রিয়া বন্ধ করে দেয়?




উত্তর:


316

আপডেট: কিছু মন্তব্য অনুসারে, মূল উত্তরের সমাধানটি আইওএস 8+ এর কিছু নির্দিষ্ট পরিস্থিতিতে কাজ করবে বলে মনে হচ্ছে না। আমি আরও বিশদ ছাড়াই যাচাই করতে পারি না যে বাস্তবে এটিই ঘটনা।

তবে আপনারা তাদের জন্য সেই পরিস্থিতিতে একটি বিকল্প আছে। ওভাররাইড করে যখন কোনও ভিউ কন্ট্রোলার পপ করা হচ্ছে তখন সনাক্ত করা সম্ভব willMove(toParentViewController:)। প্রাথমিক ধারণাটি হ'ল কোনও ভিউ কন্ট্রোলার যখন পপ parentহয় nil

আরও তথ্যের জন্য "একটি ধারক দেখুন নিয়ন্ত্রণকারী বাস্তবায়ন করা " দেখুন


আইওএস 5 যেহেতু আমি খুঁজে পেয়েছি যে এই পরিস্থিতিটি মোকাবেলার সহজতম পদ্ধতিটি নতুন পদ্ধতিটি ব্যবহার করছে - (BOOL)isMovingFromParentViewController:

- (void)viewWillDisappear:(BOOL)animated {
  [super viewWillDisappear:animated];

  if (self.isMovingFromParentViewController) {
    // Do your stuff here
  }
}

- (BOOL)isMovingFromParentViewController আপনি যখন নেভিগেশন স্ট্যাকে কন্ট্রোলারদের চাপ দিচ্ছেন এবং পপ করছেন তখন তা বোঝা যায়।

তবে, আপনি যদি মডেল ভিউ কন্ট্রোলার উপস্থাপন করেন তবে - (BOOL)isBeingDismissedপরিবর্তে আপনার ব্যবহার করা উচিত :

- (void)viewWillDisappear:(BOOL)animated {
  [super viewWillDisappear:animated];

  if (self.isBeingDismissed) {
    // Do your stuff here
  }
}

এই প্রশ্নে উল্লিখিত হিসাবে , আপনি উভয় বৈশিষ্ট্য একত্রিত করতে পারেন:

- (void)viewWillDisappear:(BOOL)animated {
  [super viewWillDisappear:animated];

  if (self.isMovingFromParentViewController || self.isBeingDismissed) {
    // Do your stuff here
  }
}

অন্যান্য সমাধান a এর অস্তিত্বের উপর নির্ভর করে UINavigationBar। পরিবর্তে আমার পদ্ধতির আরও পছন্দ করুন কারণ এটি ইভেন্টটি উদ্ঘাটনকারী ক্রিয়া থেকে সঞ্চালনের জন্য প্রয়োজনীয় কাজগুলিকে ডিউপুল করে, অর্থাত্ একটি পিছনে বোতাম টিপুন।


আমি আপনার উত্তর পছন্দ। তবে কেন আপনি 'সেলফ.আইসবিজডিজমড' ব্যবহার করেছেন? আমার ক্ষেত্রে, 'self.isBeingDismused' এর বিবৃতিগুলি কার্যকর হয় না।
utতভিজ কোটিচা

3
self.isMovingFromParentViewControllerpopToRootViewControllerAnimatedপিছনে বোতামটিতে কোনও স্পর্শ ছাড়াই - আমি যখন প্রোগ্রামিকভাবে ব্যবহার করে নেভিগেশন স্ট্যাকটি পপ করছি তখন এর সত্য মান থাকে । আমি কি আপনার উত্তর ডাউন করা উচিত? (বিষয় বলছে "'পিছনে' বোতামটি একটি নভবারে চাপছে")
কাস-কাদ

2
ভয়ানক উত্তর, আপনাকে অনেক ধন্যবাদ। override func viewWillDisappear(animated: Bool) { super.viewWillDisappear(animated) if isMovingFromParentViewController(){ println("back button pressed") } }
সুইফটে

1
আপনার কেবলমাত্র -viewDidDisappear:এটি করা উচিত কারণ এটি সম্ভব যে আপনি একটি -viewWillDisappear:ছাড়াই পাবেন -viewDidDisappear:(যেমন আপনি যখন নেভিগেশন কন্ট্রোলার আইটেমটি বরখাস্ত করার জন্য সোয়াইপ করা শুরু করেন এবং তারপরে এই সোয়াইপটি বাতিল করেন
হিথ সীমান্ত

3
দেখে মনে হচ্ছে এটি আর নির্ভরযোগ্য সমাধান নয়। আমি প্রথম এটি ব্যবহার করার সময় কাজ করেছি (এটি ছিল আইওএস 10)। তবে এখন আমি দুর্ঘটনাক্রমে এটি শান্তভাবে কাজ বন্ধ করে দেখতে পেয়েছি (আইওএস 11)। "উইলমোভ (টু প্যারেন্টভিউ কনট্রোলার)" সমাধানটিতে স্যুইচ করতে হয়েছিল।
ভিটালি 14

100

যদিও viewWillAppear()এবং viewDidDisappear() করছে যখন ব্যাক বোতাম চাপড় মেরে বলা, তারা অন্য সময়ে বলা হয়। এটি সম্পর্কে আরও উত্তর দেখুন।

ইউআইভিউউকন্ট্রোলআর পিতামাতার ব্যবহার

willMoveToParentViewController(_:)OR এর সহায়তায় ভিসি যখন তার প্যারেন্ট (নেভিগেশনকন্ট্রোলার) থেকে সরিয়ে ফেলা হয় তখন পিছনের বোতামটি সনাক্ত করা আরও ভাল হয়didMoveToParentViewController()

যদি পিতামাতারা শূন্য থাকে তবে ভিউ কন্ট্রোলারটি নেভিগেশন স্ট্যাক থেকে পপ করা হচ্ছে এবং খারিজ করা হবে। পিতামাতা যদি শূন্য না হন তবে এটি স্ট্যাকের সাথে যুক্ত হয়ে উপস্থাপিত হচ্ছে।

// Objective-C
-(void)willMoveToParentViewController:(UIViewController *)parent {
     [super willMoveToParentViewController:parent];
    if (!parent){
       // The back button was pressed or interactive gesture used
    }
}


// Swift
override func willMove(toParent parent: UIViewController?) {
    super.willMove(toParent: parent)
    if parent == nil {
        // The back button was pressed or interactive gesture used
    }
}

এর জন্য অদলবদল করুন এবং ভিউ কন্ট্রোলারকে বরখাস্ত করার পরে কাজ করার willMoveজন্য didMoveস্ব-পিতা-মাতাকে পরীক্ষা করুন ।

বরখাস্ত করা বন্ধ করা হচ্ছে

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

var backButton : UIBarButtonItem!

override func viewDidLoad() {
    super.viewDidLoad()

     // Disable the swipe to make sure you get your chance to save
     self.navigationController?.interactivePopGestureRecognizer.enabled = false

     // Replace the default back button
    self.navigationItem.setHidesBackButton(true, animated: false)
    self.backButton = UIBarButtonItem(title: "Back", style: UIBarButtonItemStyle.Plain, target: self, action: "goBack")
    self.navigationItem.leftBarButtonItem = backButton
}

// Then handle the button selection
func goBack() {
    // Here we just remove the back button, you could also disabled it or better yet show an activityIndicator
    self.navigationItem.leftBarButtonItem = nil
    someData.saveInBackground { (success, error) -> Void in
        if success {
            self.navigationController?.popViewControllerAnimated(true)
            // Don't forget to re-enable the interactive gesture
            self.navigationController?.interactivePopGestureRecognizer.enabled = true
        }
        else {
            self.navigationItem.leftBarButtonItem = self.backButton
            // Handle the error
        }
    }
}


দেখার বিষয়ে আরও প্রদর্শিত হবে / উপস্থিত হবে

আপনি যদি viewWillAppear viewDidDisappearসমস্যাটি না পেয়ে থাকেন তবে আসুন একটি উদাহরণ দিয়ে দেখি। বলুন আপনার কাছে তিনটি ভিউ কন্ট্রোলার রয়েছে:

  1. ListVC: একটি সারণী দর্শন
  2. বিশদ বিবরণ : একটি জিনিস সম্পর্কে বিশদ
  3. সেটিংসভিসি: কোনও জিনিসের জন্য কিছু বিকল্প

কল অনুসরণ দেয় detailVCহিসাবে আপনি থেকে যান listVCথেকে settingsVCএবং ফিরেlistVC

তালিকা> বিশদ (বিবরণ ধাপ VV) Detail.viewDidAppear<- প্রদর্শিত
বিশদ> সেটিংস (পুশ সেটিংস VC ) Detail.viewDidDisappear<- অদৃশ্য

এবং হিসাবে আমরা ফিরে যেতে ...
সেটিংস> বিস্তারিত (পপ settingsVC) Detail.viewDidAppear<- প্রদর্শিত
বিস্তারিত> তালিকা (পপ detailVC) Detail.viewDidDisappear<- অদৃশ্য

লক্ষ্য করুন যে viewDidDisappearএকাধিকবার বলা হয়, কেবল ফিরে যাওয়ার সময় নয়, এগিয়ে যাওয়ার সময়ও। দ্রুত অপারেশনের জন্য যা কাঙ্ক্ষিত হতে পারে, তবে নেটওয়ার্ক কলের মতো আরও জটিল ক্রিয়াকলাপের জন্য, এটি নাও পারে।


কেবলমাত্র একটি নোট, ব্যবহারকারী didMoveToParantViewController:কাজ করতে হবে যখন দৃশ্যটি আর দৃশ্যমান হয় না। ইন্টারঅ্যাকটিভ
জিশুটারের

ডডমোভটোপ্যারেন্টভিউ কনট্রোলার * টাইপো আছে
9:00

[সুপার উইলমোভটোপেন্টিভিউ কনট্রোলার: পিতামাতাকে] কল করতে ভুলবেন না!
স্কটিটিবি

2
আপনি যখন প্যারেন্ট ভিউ কন্ট্রোলারে পপ করছেন তখন প্যারামিটার প্যারামিটারটি শূন্য থাকে এবং যখন এই পদ্ধতিটিতে দেখা ভিউটি প্রদর্শিত হবে তখন নন-শূন্য নয়। আপনি সেই ব্যপারটি কেবল তখনই কোনও ক্রিয়া করতে ব্যবহার করতে পারেন যখন পিছনের বোতামটি টিপানো হয়, এবং ভিউতে পৌঁছানোর সময় নয়। আসলে, মূল প্রশ্ন ছিল। :)
মাইকে

1
প্রোগ্রামগতভাবে ব্যবহার করার সময় এটিও ডাকা হয় _ = self.navigationController?.popViewController(animated: true), সুতরাং এটি কেবল কোনও পিছনের বোতাম টিপে ডাকা হয় না। আমি এমন একটি কল খুঁজছি যা কেবল তখনই টিপুন যখন কাজ করে ।
এথান অ্যালেন

16

প্রথম পদ্ধতি

- (void)didMoveToParentViewController:(UIViewController *)parent
{
    if (![parent isEqual:self.parentViewController]) {
         NSLog(@"Back pressed");
    }
}

দ্বিতীয় পদ্ধতি

-(void) viewWillDisappear:(BOOL)animated {
    if ([self.navigationController.viewControllers indexOfObject:self]==NSNotFound) {
       // back button was pressed.  We know this is true because self is no longer
       // in the navigation stack.  
    }
    [super viewWillDisappear:animated];
}

1
দ্বিতীয় পদ্ধতিটি ছিল আমার জন্য একমাত্র কাজ। আমার দৃষ্টিভঙ্গি উপস্থাপনের জন্য প্রথম পদ্ধতিটিও আহ্বান করা হয়েছিল, যা আমার ব্যবহারের ক্ষেত্রে গ্রহণযোগ্য নয়।
marcshilling

10

যাঁরা দাবি করেন যে এটি কাজ করে না তাদের ভুল:

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    if self.isMovingFromParent {
        print("we are being popped")
    }
}

এটা ঠিক কাজ করে। তাহলে কী এমন বিস্তৃত কল্পকাহিনী সৃষ্টি করছে যা তা নয়?

সমস্যাটি মনে হয় একটি পৃথক পদ্ধতির ভুল বাস্তবায়নের কারণে , যাকে willMove(toParent:)কল করতে ভুলে গিয়েছিল super

যদি আপনি willMove(toParent:)কল না করে বাস্তবায়ন করেন superতবে self.isMovingFromParentতা হবে falseএবং ব্যবহার হবেviewWillDisappear ব্যর্থ হবে appear এটি ব্যর্থ হয়নি; এটি তুমি ভেঙ্গেছিলে.

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

সম্পাদনা করুন একটি মন্তব্য পরামর্শ দেয় যে এটিরviewDidDisappear চেয়ে বরং হওয়া উচিত viewWillDisappear


এই কোডটি কার্যকর করা হয় যখন পিছনের বোতামটি টেপ করা হয়, তবে ভিসি প্রোগ্রামযুক্তভাবে পপ করা হয় তবে তা কার্যকর করা হয়।
বায়োমিকার ২

@ বায়োমিকার শিওর, তবে অন্যান্য পদ্ধতির ক্ষেত্রেও এটি সত্য true পপিং পপিং করছে। আপনি যখন প্রোগ্রামক্রমে পপ করবেন না তখন কীভাবে পপ সনাক্ত করবেন তা প্রশ্ন । আপনি যদি প্রোগ্রামক্রমে পপ করেন তবে আপনি ইতিমধ্যে জানেন যে আপনি পপিং করছেন তাই সনাক্ত করার মতো কিছুই নেই।
ম্যাট

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

1
দুর্ভাগ্যক্রমে trueএটি ইন্টারেক্টিভ সোয়াইপ পপ অঙ্গভঙ্গির জন্য - ভিউ কন্ট্রোলারের বাম প্রান্ত থেকে - এমনকি যদি সোয়াইপ এটি পুরোপুরি পপ না করে। সুতরাং পরিবর্তে এটা-পরীক্ষা willDisappear, ইন এমনটি didDisappearকাজ করে।
বর্ধনগনেশ

1
@ বাধনগনেশ ধন্যবাদ, তথ্যটি অন্তর্ভুক্ত করার জন্য সম্পাদিত উত্তর।
13:17

9

আমি এই সমস্যাটি নিয়ে দু'দিন ধরে খেলছি (বা লড়াই করছি)। আইএমও সর্বোত্তম পন্থা কেবলমাত্র একটি এক্সটেনশন ক্লাস এবং প্রোটোকল তৈরি করা, এটি:

@protocol UINavigationControllerBackButtonDelegate <NSObject>
/**
 * Indicates that the back button was pressed.
 * If this message is implemented the pop logic must be manually handled.
 */
- (void)backButtonPressed;
@end

@interface UINavigationController(BackButtonHandler)
@end

@implementation UINavigationController(BackButtonHandler)
- (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPopItem:(UINavigationItem *)item
{
    UIViewController *topViewController = self.topViewController;
    BOOL wasBackButtonClicked = topViewController.navigationItem == item;
    SEL backButtonPressedSel = @selector(backButtonPressed);
    if (wasBackButtonClicked && [topViewController respondsToSelector:backButtonPressedSel]) {
        [topViewController performSelector:backButtonPressedSel];
        return NO;
    }
    else {
        [self popViewControllerAnimated:YES];
        return YES;
    }
}
@end

এটি কাজ করে কারণ UINavigationControllerএকটি কল পাবেনnavigationBar:shouldPopItem: দর্শকের নিয়ামক পপ সময় প্রতিবারই । সেখানে আমরা সনাক্ত করেছি যে পিছনে চাপ দেওয়া হয়েছিল কিনা (অন্য কোনও বোতাম)। আপনাকে কেবলমাত্র যা করতে হবে তা হল ভিউ কন্ট্রোলারে যেখানে পিছনে চাপ দেওয়া হয় সেখানে প্রোটোকলটি প্রয়োগ করা।

backButtonPressedSelসবকিছু ঠিকঠাক থাকলে ম্যানুয়ালি ভিউ কন্ট্রোলারের ভিতরে পপ করতে ভুলবেন না ।

যদি আপনি ইতিমধ্যে সাবক্ল্যাসড UINavigationViewControllerএবং কার্যকর করে ফেলেছেন তবে navigationBar:shouldPopItem:চিন্তা করবেন না, এটি এতে হস্তক্ষেপ করবে না।

আপনি পিছনের অঙ্গভঙ্গিটি অক্ষম করতে আগ্রহীও হতে পারেন।

if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
    self.navigationController.interactivePopGestureRecognizer.enabled = NO;
}

1
এই উত্তরটি আমার জন্য প্রায় সম্পূর্ণ ছিল, আমি ছাড়া 2 টি ভিউকন্ট্রোলাররা প্রায়শই পপড হয়ে যেত। হ্যাঁ ফিরে আসার ফলে কলিং পদ্ধতিটি পপকে কল করে, সুতরাং পপ কল করার পাশাপাশি 2 জন ভিউকন্ট্রোলার পপ হওয়ার কথা। : আরও deets জন্য অন্য প্রশ্নে এই উত্তর (ক খুবই সুন্দর একটি উত্তর যে আরো upvotes দাবী) দেখুন stackoverflow.com/a/26084150/978083
জেসন রিজ

ভাল কথা, আমার বিবরণটি সেই সত্য সম্পর্কে পরিষ্কার ছিল না। "সবকিছু ঠিকঠাক থাকলে ম্যানুয়ালি ভিউ কন্ট্রোলারটি পপ করতে ভুলবেন না" এটি কেবল "না" ফেরার ক্ষেত্রে, অন্যথায় প্রবাহটি স্বাভাবিক পপ।
7ynk3r

1
"অন্য" শাখার জন্য, আপনি যদি পপ নিজেকে পরিচালনা করতে চান না এবং এটি যা ঠিক মনে করেন, যা বেশিরভাগ হ্যাঁ, তবে এটি পপ নিজেই যত্ন নেয় এবং শেভ্রনকে যথাযথভাবে অ্যানিমেট করে না দিতে চাইলে সুপার বাস্তবায়নকে কল করা ভাল better ।
বেন সিনক্লেয়ার

9

এটি সুইফট সহ আইওএস 9.3.x এ আমার জন্য কাজ করে:

override func didMoveToParentViewController(parent: UIViewController?) {
    super.didMoveToParentViewController(parent)

    if parent == self.navigationController?.parentViewController {
        print("Back tapped")
    }
}

এখানে অন্যান্য সমাধানগুলির মতো নয়, এটি অপ্রত্যাশিতভাবে ট্রিগার হবে বলে মনে হয় না।


পরিবর্তে উইলমোভ ব্যবহার করা ভাল
ইউজিন গর্ডিন

4

রেকর্ডটির জন্য, আমি মনে করি এটি তার চেয়ে বেশি যা তিনি খুঁজছিলেন ...

    UIBarButtonItem *l_backButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemRewind target:self action:@selector(backToRootView:)];

    self.navigationItem.leftBarButtonItem = l_backButton;


    - (void) backToRootView:(id)sender {

        // Perform some custom code

        [self.navigationController popToRootViewControllerAnimated:YES];
    }

1
ধন্যবাদ পল, এই সমাধানটি বেশ সহজ। দুর্ভাগ্যক্রমে, আইকনটি আলাদা। এটি "রিওয়াইন্ড" আইকন, পিছনের আইকন নয়। সম্ভবত পিছনের আইকনটি ব্যবহার করার কোনও উপায় রয়েছে ...
ফেরান মেলিনঞ্চ

2

যেমনটি purrrminatorবলা হয়েছে, উত্তরটি elitalonপুরোপুরি সঠিক নয়, যেহেতুyour stuff প্রোগ্রামারিকভাবে নিয়ামককে পপ করার সময়ও কার্যকর করা হবে।

আমি এখন পর্যন্ত যে সমাধানটি পেয়েছি তা খুব সুন্দর নয় তবে এটি আমার পক্ষে কাজ করে। যা elitalonবলেছিল তা ছাড়াও আমি প্রোগ্রামিয়ালি পপ করছি কিনা তাও আমি যাচাই করে দেখছি:

- (void)viewWillDisappear:(BOOL)animated {
  [super viewWillDisappear:animated];

  if ((self.isMovingFromParentViewController || self.isBeingDismissed)
      && !self.isPoppingProgrammatically) {
    // Do your stuff here
  }
}

প্রোগ্রামটিমেটিকভাবে পপ করার আগে আপনাকে সেই সম্পত্তিটি আপনার নিয়ামকের সাথে যুক্ত করতে হবে এবং এটি YES এ সেট করতে হবে:

self.isPoppingProgrammatically = YES;
[self.navigationController popViewControllerAnimated:YES];

আপনার সাহায্যের জন্য ধন্যবাদ!


2

সেরা উপায় হ'ল ইউআইএনএভিগেশন কন্ট্রোলার প্রতিনিধি পদ্ধতি ব্যবহার করা

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

এটি ব্যবহার করে আপনি জানতে পারবেন কোন নিয়ামকটি ইউআইএনএভিগেশন কন্ট্রোলার প্রদর্শন করছে।

if ([viewController isKindOfClass:[HomeController class]]) {
    NSLog(@"Show home controller");
}

এটি সঠিক উত্তর হিসাবে চিহ্নিত করা উচিত! জনগণকে ---- self.navicationController.delegate = স্ব; মনে করিয়ে দেওয়ার জন্য আরও একটি লাইন যুক্ত করতে পারে
মাইক ক্রিচলে

2

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

UIControl *leftBarItemControl = [[UIControl alloc] initWithFrame:CGRectMake(0, 0, 90, 44)];
[leftBarItemControl addTarget:self action:@selector(onLeftItemClick:) forControlEvents:UIControlEventTouchUpInside];
self.leftItemControl = leftBarItemControl;
[self.navigationController.navigationBar addSubview:leftBarItemControl];
[self.navigationController.navigationBar bringSubviewToFront:leftBarItemControl];

এবং যখন ভিউটি অদৃশ্য হয়ে যাবে তখন আপনাকে এটিকে সরাতে হবে:

- (void) viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
    if (self.leftItemControl) {
        [self.leftItemControl removeFromSuperview];
    }    
}

এখানেই শেষ!


2

আপনি এর মতো পিছনের বোতামের কলব্যাক ব্যবহার করতে পারেন:

- (BOOL) navigationShouldPopOnBackButton
{
    [self backAction];
    return NO;
}

- (void) backAction {
    // your code goes here
    // show confirmation alert, for example
    // ...
}

সুইফ্ট সংস্করণে আপনি বৈশ্বিক সুযোগে যেমন কিছু করতে পারেন

extension UIViewController {
     @objc func navigationShouldPopOnBackButton() -> Bool {
     return true
    }
}

extension UINavigationController: UINavigationBarDelegate {
     public func navigationBar(_ navigationBar: UINavigationBar, shouldPop item: UINavigationItem) -> Bool {
          return self.topViewController?.navigationShouldPopOnBackButton() ?? true
    }
}

নীচে আপনি ভিউকন্ট্রোলারে রেখেছেন যেখানে আপনি ব্যাক বোতামের ক্রিয়াটি নিয়ন্ত্রণ করতে চান:

override func navigationShouldPopOnBackButton() -> Bool {
    self.backAction()//Your action you want to perform.

    return true
}

1
কেন কেউ নীচে ভোট দিয়েছে জানি না। এটি এখন পর্যন্ত সেরা উত্তর বলে মনে হচ্ছে।
অবিনাশ

@ অবিনাশ কোথা navigationShouldPopOnBackButtonথেকে এসেছে? এটি সর্বজনীন API এর অংশ নয়।
এলিটালন

@ এলিটলন দুঃখিত, এটি অর্ধেক উত্তর ছিল। আমি ভাবলাম বাকী প্রসঙ্গেই প্রশ্ন রয়েছে। যাইহোক, এখনই উত্তর আপডেট করেছেন
অবিনাশ

1

কলি ৮৮ যেমন বলেছেন, আপনার ইউআইএনএভিগেশনবারডেলিগেট প্রোটোকলটি পরীক্ষা করা উচিত।

আরও সাধারণ উপায়ে, আপনি - (void)viewWillDisapear:(BOOL)animatedবর্তমানে দৃশ্যমান দর্শনীয় নিয়ামক দ্বারা রক্ষিত দৃশ্যটি অদৃশ্য হওয়ার সময় কাস্টম কাজ সম্পাদন করতেও ব্যবহার করতে পারেন । দুর্ভাগ্যক্রমে, এটি ধাক্কা এবং পপ ক্ষেত্রে বিরক্ত করবে।


1

একটি ইউআইএনএভিগেশন কন্ট্রোলার সহ সুইফ্টের জন্য:

override func viewWillDisappear(animated: Bool) {
    super.viewWillDisappear(animated)
    if self.navigationController?.topViewController != self {
        print("back button tapped")
    }
}

1

7 ইঙ্ক 3 এর উত্তরটি আমি শেষ পর্যন্ত যা ব্যবহার করেছি তার সত্যিই নিকটে ছিল তবে এর জন্য কিছু টুইটের দরকার ছিল:

- (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPopItem:(UINavigationItem *)item {

    UIViewController *topViewController = self.topViewController;
    BOOL wasBackButtonClicked = topViewController.navigationItem == item;

    if (wasBackButtonClicked) {
        if ([topViewController respondsToSelector:@selector(navBackButtonPressed)]) {
            // if user did press back on the view controller where you handle the navBackButtonPressed
            [topViewController performSelector:@selector(navBackButtonPressed)];
            return NO;
        } else {
            // if user did press back but you are not on the view controller that can handle the navBackButtonPressed
            [self popViewControllerAnimated:YES];
            return YES;
        }
    } else {
        // when you call popViewController programmatically you do not want to pop it twice
        return YES;
    }
}


0

স্ব.নিভিগেশন কন্ট্রোলআরআইস মুভিংফ্র্যাম্পেন্টভিউ কন্ট্রোলার আইওএস 8 এবং 9 এ আমি ব্যবহার করি না:

-(void) viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
    if (self.navigationController.topViewController != self)
    {
        // Is Popping
    }
}

-1

(স্যুইফ্ট)

ফাইনালি সলিউশন সলিউশন .. আমরা যে পদ্ধতিটি সন্ধান করছিলাম সেটি হ'ল "উইলশোভিউ কনট্রোলার" যা ইউআইএনএভিগেশন কন্ট্রোলারের প্রতিনিধি পদ্ধতি

//IMPORT UINavigationControllerDelegate !!
class PushedController: UIViewController, UINavigationControllerDelegate {

    override func viewDidLoad() {
        //set delegate to current class (self)
        navigationController?.delegate = self
    }

    func navigationController(navigationController: UINavigationController, willShowViewController viewController: UIViewController, animated: Bool) {
        //MyViewController shoud be the name of your parent Class
        if var myViewController = viewController as? MyViewController {
            //YOUR STUFF
        }
    }
}

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