दिलचस्प पोस्ट
एसक्यूएल सर्वर में group_concat के साथ एक क्वेरी कैसे करें छवियों के साथ ओपनसीवी और एसवीएम का उपयोग करना रूबी में स्ट्रिंग प्रक्षेप काम क्यों करता है जब कोई कर्ल ब्रेसिज़ नहीं होता है? ResultSet.getString (1) java.sql फेंकता है। QLException: वर्तमान कर्सर स्थिति में अमान्य ऑपरेशन आईफोन: एनीमेशन के साथ टैब कैसे स्विच करें? चित्रों के बीच का स्थान निकालने के लिए सीएसएस का उपयोग करें आईओएस 10 / एक्सकोड 8 में डिवाइसों पर एनएसएलॉग छंटने लगता है? क्यूं कर? एक ListBox के साथ WPF ListBox – यूआई वर्चुअलाइजेशन और स्क्रॉलिंग अनुमति के अलावा सभी HTML टैग पट्टी करें सांख्यिकीय विश्लेषण और रिपोर्ट लेखन के लिए कार्यप्रवाह मैं सी # से पायथन स्क्रिप्ट कैसे चलाऊँ? सी ++ स्थिर प्रारंभिक आदेश सर्वर का आईपी पता कैसे प्राप्त करें जिस पर मेरा सी # एप्लिकेशन चल रहा है? Google Chrome – क्रोम बीटा 8 के लिए फ़ाईल-एक्सेस-से-एक्सेस-फाइलें अक्षम हैं त्रुटि: कार्य निष्पादन के लिए विफल ': एंड्रॉइड: रूपांतरण क्लासेस और संसाधनों के साथ पीओजीआरएआरएफआरईईआरई'

नेविगेशन नियंत्रक में वापस बटन के लिए कार्रवाई सेट करना

मैं नेविगेशन नियंत्रक में वापस बटन की डिफ़ॉल्ट कार्रवाई को ओवरराइट करने की कोशिश कर रहा हूं मैंने कस्टम बटन पर कोई कार्रवाई एक लक्ष्य प्रदान की है अजीब बात यह है कि जब इसे निर्दिष्ट करते हुए बैकबटन विशेषता यह उन पर ध्यान नहीं देता है और यह सिर्फ वर्तमान दृश्य को चबूतरे और मूल पर वापस जाता है:

UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle: @"Servers" style:UIBarButtonItemStylePlain target:self action:@selector(home)]; self.navigationItem.backBarButtonItem = backButton; 

जैसे ही मैं इसे बाएं के माध्यम से सेट करता हूं, नेविगेशन पर बार्टटूटइटम Item यह मेरी कार्रवाई कॉल करता है, हालांकि, तब बटन एक पीछे की ओर एक के बजाय एक सादे दौर की तरह दिखता है:

 self.navigationItem.leftBarButtonItem = backButton; 

रूट व्यू पर वापस जाने से पहले मैं अपनी कस्टम क्रिया को कॉल करने के लिए कैसे पा सकता हूं? क्या डिफ़ॉल्ट वापस कार्रवाई को ओवरराइट करने का कोई तरीका है, या क्या कोई तरीका है जिसे हमेशा एक दृश्य छोड़ते समय कहा जाता है (देखिएडडयूएनलोड ऐसा नहीं करता)?

वेब के समाधान से एकत्रित समाधान "नेविगेशन नियंत्रक में वापस बटन के लिए कार्रवाई सेट करना"

इसे दृश्य नियंत्रक में डालने का प्रयास करें जहां आप प्रेस का पता लगा सकते हैं:

 -(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]; } 

मैंने UIViewController-BackButtonHandler एक्सटेंशन को लागू किया है। इसे कुछ भी उप-वर्ग की आवश्यकता नहीं है, बस इसे अपनी प्रोजेक्ट में डालें और navigationShouldPopOnBackButton UIViewController विधि UIViewController वर्ग में:

 -(BOOL) navigationShouldPopOnBackButton { if(needsShowConfirmation) { // Show confirmation alert // ... return NO; // Ignore 'Back' button this time } return YES; // Process 'Back' button click and Pop view controler } 

नमूना एप्लिकेशन डाउनलोड करें

अमेगमेमार के विपरीत, यह संभव है। आपको अपने नेविगेशन नियंत्रक को उप-वर्ग देना होगा। मैंने सब कुछ समझाया (उदाहरण कोड सहित): http://www.hanspinckaers.com/custom-action-on-back-button-uinavigationcontroller

स्विफ्ट वर्शन:

( https://stackoverflow.com/a/19132881/826435 के )

आपके दृश्य नियंत्रक में आप केवल एक प्रोटोकॉल के अनुरूप हैं और आपको जो कुछ भी कार्य करना है उसे निष्पादित करें:

 extension MyViewController: NavigationControllerBackButtonDelegate { func shouldPopOnBackButtonPress() -> Bool { performSomeActionOnThePressOfABackButton() return false } } 

फिर एक वर्ग बनाएं, NavigationController+BackButton , और नीचे दिए गए कोड को कॉपी-पेस्ट करें:

 protocol NavigationControllerBackButtonDelegate { func shouldPopOnBackButtonPress() -> Bool } extension UINavigationController { public func navigationBar(_ navigationBar: UINavigationBar, shouldPop item: UINavigationItem) -> Bool { // Prevents from a synchronization issue of popping too many navigation items // and not enough view controllers or viceversa from unusual tapping if viewControllers.count < navigationBar.items!.count { return true } // Check if we have a view controller that wants to respond to being popped var shouldPop = true if let viewController = topViewController as? NavigationControllerBackButtonDelegate { shouldPop = viewController.shouldPopOnBackButtonPress() } if (shouldPop) { DispatchQueue.main.async { self.popViewController(animated: true) } } else { // Prevent the back button from staying in an disabled state for view in navigationBar.subviews { if view.alpha < 1.0 { UIView.animate(withDuration: 0.25, animations: { view.alpha = 1.0 }) } } } return false } } 

यह सीधे करना संभव नहीं है कुछ विकल्प हैं:

  1. अपनी खुद की कस्टम UIBarButtonItem बनाएँ जो टेप पर जांच करता है और अगर परीक्षा पास हो जाती है
  2. UITextField प्रतिनिधि विधि, जैसे- -textFieldShouldReturn: का उपयोग करते हुए फॉर्म फ़ील्ड की सामग्री को मान्य करें, जिसे कि Return या Done बटन के बाद कहा जाता है कीबोर्ड पर दबाया जाता है

पहले विकल्प के नकारात्मक पक्ष यह है कि बैक बटन का बाईं ओर वाला तीर शैली कस्टम बार बटन से नहीं पहुंचा जा सकता है तो आपको एक छवि का उपयोग करना होगा या एक नियमित शैली बटन के साथ जाना होगा

दूसरा विकल्प अच्छा है क्योंकि आप पाठ क्षेत्र को प्रतिनिधि विधि में वापस प्राप्त करते हैं, ताकि आप प्रतिनिधि कॉल-बैक विधि को भेजे गए विशिष्ट पाठ फ़ील्ड के लिए अपने सत्यापन तर्क को लक्षित कर सकें।

कुछ थ्रेडिंग कारणों के लिए, @HansPinckaers द्वारा उल्लिखित समाधान मेरे लिए सही नहीं था, लेकिन मुझे वापस बटन पर एक स्पर्श को पकड़ने का एक बहुत ही आसान तरीका मिला, और मैं इसे नीचे पिन करना चाहता हूं, अगर यह धोखे के घंटे से बचने के लिए हो सकता है कोई और। चाल वास्तव में आसान है: बस अपने यूआईएनवीगेशनबार में एक सबव्यू के रूप में एक पारदर्शी UIButton जोड़ें, और उसके लिए अपने चयनकर्ताओं को सेट करें जैसे कि यह असली बटन था! यहाँ मोनोचौच और सी # का उपयोग करते हुए एक उदाहरण है, लेकिन उद्देश्य-सी में अनुवाद को खोजने के लिए बहुत मुश्किल नहीं होना चाहिए।

 public class Test : UIViewController { public override void ViewDidLoad() { UIButton b = new UIButton(new RectangleF(0, 0, 60, 44)); //width must be adapted to label contained in button b.BackgroundColor = UIColor.Clear; //making the background invisible b.Title = string.Empty; // and no need to write anything b.TouchDown += delegate { Console.WriteLine("caught!"); if (true) // check what you want here NavigationController.PopViewControllerAnimated(true); // and then we pop if we want }; NavigationController.NavigationBar.AddSubview(button); // insert the button to the nav bar } } 

मजेदार तथ्य: परीक्षण उद्देश्यों के लिए और मेरे नकली बटन के लिए अच्छे आयाम ढूंढने के लिए, मैं अपनी पृष्ठभूमि का रंग नीले रंग में सेट कर रहा हूँ … और यह बैक बटन के पीछे दिखाता है! वैसे भी, यह अभी भी मूल बटन को लक्षित करने के लिए किसी स्पर्श को पकड़ता है।

यह तकनीक आपको किसी भी दृश्य नियंत्रकों के शीर्षक को प्रभावित किए बिना या एनीमेशन के दौरान वापस बटन पाठ परिवर्तन को देखने के बिना "बैक" बटन का टेक्स्ट बदलने की अनुमति देता है।

इसे कॉलिंग व्यू नियंत्रक में init विधि में जोड़ें:

 UIBarButtonItem *temporaryBarButtonItem = [[UIBarButtonItem alloc] init]; temporaryBarButtonItem.title = @"Back"; self.navigationItem.backBarButtonItem = temporaryBarButtonItem; [temporaryBarButtonItem release]; 

एक समाधान मिला जो वापस बटन शैली को भी बरकरार रखता है। अपने दृश्य नियंत्रक को निम्न विधि जोड़ें

 -(void) overrideBack{ UIButton *transparentButton = [[UIButton alloc] init]; [transparentButton setFrame:CGRectMake(0,0, 50, 40)]; [transparentButton setBackgroundColor:[UIColor clearColor]]; [transparentButton addTarget:self action:@selector(backAction:) forControlEvents:UIControlEventTouchUpInside]; [self.navigationController.navigationBar addSubview:transparentButton]; } 

अब निम्न पद्धति में आवश्यक कार्यक्षमता प्रदान करें:

 -(void)backAction:(UIBarButtonItem *)sender { //Your functionality } 

यह सब एक पारदर्शी बटन के साथ वापस बटन को कवर करना है;)

मुझे विश्वास नहीं है कि यह संभव है, आसानी से। एकमात्र ऐसा तरीका जिस पर मैं विश्वास करता हूं कि वहां अपना स्थान वापस करने के लिए अपनी खुद की पीठ बटन तीर छवि बनाने के लिए। यह पहली बार मेरे लिए निराशाजनक था, लेकिन मैं देखता हूं कि, निरंतरता के लिए, इसे छोड़ दिया गया था।

आप एक नियमित बटन बनाकर डिफ़ॉल्ट बैक बटन को छिपाने के लिए करीब (तीर के बिना) प्राप्त कर सकते हैं:

 self.navigationItem.leftBarButtonItem = [[[UIBarButtonItem alloc] initWithTitle:@"Servers" style:UIBarButtonItemStyleDone target:nil action:nil] autorelease]; self.navigationItem.hidesBackButton = YES; 

UINavigationBar के प्रतिनिधि विधि को सिर्फ उप-क्लास करने और ShouldPopItem विधि को ओवरराइड करके एक आसान तरीका है।

सबसे आसान उपाय

आप UINavigationController के प्रतिनिधि विधियों का उपयोग कर सकते हैं। जब आपके वीसी के बैक बटन को दबाया जाता है, तो willShowViewController को बुलाया जाएगा। जब आप बीटीएन दबाएंगे

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

एकाग्रता का समाधान सुरक्षित नहीं है। एपल के आधिकारिक दस्तावेजों के अनुसार, https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/CustomizingExistingClasses/CustomizingExistingClasses.html , हमें ऐसा करने से बचना चाहिए।

"यदि किसी श्रेणी में घोषित विधि का नाम मूल वर्ग में एक विधि के समान है, या एक ही श्रेणी (या यहां तक ​​कि एक सुपरक्लास) पर किसी अन्य श्रेणी में एक विधि है, तो व्यवहार को अपरिभाषित नहीं किया जाता है क्योंकि किस पद्धति का कार्यान्वयन उपयोग किया जाता है रनटाइम पर। यदि आप अपनी कक्षाओं के साथ श्रेणियों का उपयोग कर रहे हैं, तो यह एक समस्या होने की संभावना कम है, लेकिन मानक कोको या कोको टच क्लास के तरीकों को जोड़ने के लिए श्रेणियों का उपयोग करते समय समस्या पैदा हो सकती है। "

स्विफ्ट का उपयोग करना:

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

लक्ष्य और एक्शन वेरिएबल्स का उपयोग करके जो आप वर्तमान में 'निल' छोड़ रहे हैं, आपको अपने सहेजे-संवादों को तार करने में सक्षम होना चाहिए ताकि उन्हें "चयनित" कहा जाने पर कहा जाए। बाहर देखो, यह अजीब क्षणों पर ट्रिगर हो सकता है

मैं ज्यादातर अमेगमेमर के साथ सहमत हूं, लेकिन मुझे नहीं लगता कि यह तीर कस्टम के साथ बटन बनाने के लिए कठिन होगा। मैं बस वापस बटन का नाम बदल सकता हूं, एक स्क्रीन शॉट लेता हूं, फ़ोटोशॉप बटन आकार की आवश्यकता होती है, और यह आपके बटन के शीर्ष पर छवि हो।

आप नेविगेशन बार्स राइट बटन आइटम तक पहुंचने की कोशिश कर सकते हैं और इसके चयनकर्ता संपत्ति को सेट कर सकते हैं … एक संदर्भ UIBarButtonItem संदर्भ को संदर्भित करता है , एक और बात अगर यह काम जो डीईफ़ काम करेगा, एक कस्टम UIBarButtonItem में एनएवी बार के सही बटन आइटम सेट करें बनाने और उसके चयनकर्ता सेट … उम्मीद है कि यह मदद करता है

ऐसे फ़ॉर्म के लिए जिसकी इस तरह उपयोगकर्ता इनपुट की आवश्यकता है, मैं इसे आपके नेविगेशन स्टैक के भाग के बजाय "मोडल" के रूप में लागू करने की सलाह देता हूं इस तरह उन्हें फार्म पर व्यवसाय का ध्यान रखना होगा, फिर आप इसे मान्य कर सकते हैं और कस्टम बटन का उपयोग कर इसे खारिज कर सकते हैं। आप एक एनएवी बार भी डिज़ाइन कर सकते हैं जो आपके बाकी एप्लिकेशन के समान दिखता है लेकिन आपको अधिक नियंत्रण प्रदान करता है।

कम से कम 5 Xcode में, एक सरल और बहुत अच्छा (सही नहीं) समाधान है आईबी में, यूटिलिटीज़ फलक पर एक बार बटन आइटम खींचें और नेविगेशन बार के बाईं ओर ड्रॉप करें जहां बैक बटन होगा। "वापस" लेबल सेट करें। आपके पास एक कार्यात्मक बटन होगा जो आप अपने IBAction के लिए टाई कर सकते हैं और अपना दृश्य बंद कर सकते हैं। नियंत्रक मैं कुछ काम कर रहा हूं और फिर इसे खोलने के लिए ट्रिगर करता हूं और यह पूरी तरह से काम करता है।

जो आदर्श नहीं है वह यह है कि यह बटन <arrow नहीं मिलता है और पिछली वीसी के शीर्षक को आगे नहीं बढ़ाता है, लेकिन मुझे लगता है कि इसे प्रबंधित किया जा सकता है। मेरे उद्देश्यों के लिए, मैंने नया "बटन" बटन को सेट किया है ताकि इसका उद्देश्य स्पष्ट हो।

आप आईबी नेविगेटर में दो बैक बटनों को भी समाप्त करते हैं, लेकिन यह स्पष्टता के लिए इसे लेबल करने के लिए आसान है।

यहां छवि विवरण दर्ज करें

तीव्र

 override func viewWillDisappear(animated: Bool) { let viewControllers = self.navigationController?.viewControllers! if indexOfArray(viewControllers!, searchObject: self) == nil { // do something } super.viewWillDisappear(animated) } func indexOfArray(array:[AnyObject], searchObject: AnyObject)-> Int? { for (index, value) in enumerate(array) { if value as UIViewController == searchObject as UIViewController { return index } } return nil } 

यह दृष्टिकोण मेरे लिए काम करता है (लेकिन "बैक" बटन में "<" चिन्ह नहीं होगा):

 - (void)viewDidLoad { [super viewDidLoad]; UIBarButtonItem* backNavButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStyleBordered target:self action:@selector(backButtonClicked)]; self.navigationItem.leftBarButtonItem = backNavButton; } -(void)backButtonClicked { // Do something... AppDelegate* delegate = (AppDelegate*)[[UIApplication sharedApplication] delegate]; [delegate.navController popViewControllerAnimated:YES]; } 

यहाँ मेरा स्विफ्ट समाधान है UIViewController के अपने उप-कक्षा में, नेविगेशन स्क्रॉलपॉइंटबैकबटन विधि को ओवरराइड करें।

 extension UIViewController { func navigationShouldPopOnBackButton() -> Bool { return true } } extension UINavigationController { func navigationBar(navigationBar: UINavigationBar, shouldPopItem item: UINavigationItem) -> Bool { if let vc = self.topViewController { if vc.navigationShouldPopOnBackButton() { self.popViewControllerAnimated(true) } else { for it in navigationBar.subviews { let view = it as! UIView if view.alpha < 1.0 { [UIView .animateWithDuration(0.25, animations: { () -> Void in view.alpha = 1.0 })] } } return false } } return true } } 

@ विलियम का जवाब हालांकि सही है, अगर उपयोगकर्ता एक स्वाइप-टू-टू-बैक जेस्चर को देखता है, तो दृश्यदृश्य भी दिखाई देता है और यहां तक ​​कि 'स्व' नेविगेशन स्टैक में नहीं होगा (अर्थात, self.navigationController.viewControllers जीत गए 'स्वयं' शामिल नहीं है), भले ही स्वाइप पूरा न हो और दृश्य नियंत्रक वास्तव में पॉप नहीं हो इस प्रकार, समाधान निम्न होगा:

  1. देखेंडिपपार में स्वाइप-टू-टू-बैक जेस्चर को अक्षम करें और केवल बैक बटन का उपयोग करके इसे उपयोग करके अनुमति दें:

     if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) { self.navigationController.interactivePopGestureRecognizer.enabled = NO; } 
  2. या बस इसके बजाय viewDidDisappear का उपयोग करें, इस प्रकार है:

     - (void)viewDidDisappear:(BOOL)animated { [super viewDidDisappear:animated]; if (![self.navigationController.viewControllers containsObject:self]) { // back button was pressed or the the swipe-to-go-back gesture was // completed. We know this is true because self is no longer // in the navigation stack. } } 

यहां से नौकरी पट्टी वापस आने से पहले नेविगेशन बार बैक बटन घटना को पकड़ने के लिए स्विफ्ट 3 संस्करण @ ओनवे का जवाब दिया गया है। UINavigationBarDelegate उपयोग UIViewController लिए नहीं किया जा सकता है, आपको एक प्रतिनिधि बनाने की आवश्यकता है जो navigationBar shouldPop को कॉल किए जाने navigationBar ट्रिगर किया जाएगा।

 @objc public protocol BackButtonDelegate { @objc optional func navigationShouldPopOnBackButton() -> Bool } extension UINavigationController: UINavigationBarDelegate { public func navigationBar(_ navigationBar: UINavigationBar, shouldPop item: UINavigationItem) -> Bool { if viewControllers.count < (navigationBar.items?.count)! { return true } var shouldPop = true let vc = self.topViewController if vc.responds(to: #selector(vc.navigationShouldPopOnBackButton)) { shouldPop = vc.navigationShouldPopOnBackButton() } if shouldPop { DispatchQueue.main.async { self.popViewController(animated: true) } } else { for subView in navigationBar.subviews { if(0 < subView.alpha && subView.alpha < 1) { UIView.animate(withDuration: 0.25, animations: { subView.alpha = 1 }) } } } return false } } 

और फिर, आपके दृश्य नियंत्रक में प्रतिनिधि कार्य जोड़ें:

 class BaseVC: UIViewController, BackButtonDelegate { func navigationShouldPopOnBackButton() -> Bool { if ... { return true } else { return false } } } 

मुझे एहसास हो गया है कि हम अक्सर उपयोगकर्ताओं को यह तय करने के लिए चेतावनी नियंत्रक जोड़ना चाहते हैं कि वे वापस जाना चाहते हैं या नहीं। यदि ऐसा है, तो आप हमेशा navigationShouldPopOnBackButton() में return false कर सकते return false navigationShouldPopOnBackButton() फ़ंक्शन और इस तरह से कुछ करके अपने दृश्य नियंत्रक को बंद करें:

 func navigationShouldPopOnBackButton() -> Bool { let alert = UIAlertController(title: "Warning", message: "Do you want to quit?", preferredStyle: .alert) alert.addAction(UIAlertAction(title: "Yes", style: .default, handler: { UIAlertAction in self.yes()})) alert.addAction(UIAlertAction(title: "No", style: .cancel, handler: { UIAlertAction in self.no()})) present(alert, animated: true, completion: nil) return false } func yes() { print("yes") DispatchQueue.main.async { _ = self.navigationController?.popViewController(animated: true) } } func no() { print("no") } 

isMovingFromParentViewController उपयोग करें

 override func viewWillDisappear(animated: Bool) { super.viewWillDisappear(true) if self.isMovingFromParentViewController { // current viewController is removed from parent // do some work } } 

वापस बटन को अवरुद्ध करने के लिए, बस इसे पारदर्शी UIControl के साथ कवर करें और स्पर्श को छूएं।

 @interface MyViewController : UIViewController { UIControl *backCover; BOOL inhibitBackButtonBOOL; } @end @implementation MyViewController -(void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; // Cover the back button (cannot do this in viewWillAppear -- too soon) if ( backCover == nil ) { backCover = [[UIControl alloc] initWithFrame:CGRectMake( 0, 0, 80, 44)]; #if TARGET_IPHONE_SIMULATOR // show the cover for testing backCover.backgroundColor = [UIColor colorWithRed:1.0 green:0.0 blue:0.0 alpha:0.15]; #endif [backCover addTarget:self action:@selector(backCoverAction) forControlEvents:UIControlEventTouchDown]; UINavigationBar *navBar = self.navigationController.navigationBar; [navBar addSubview:backCover]; } } -(void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; [backCover removeFromSuperview]; backCover = nil; } - (void)backCoverAction { if ( inhibitBackButtonBOOL ) { NSLog(@"Back button aborted"); // notify the user why... } else { [self.navigationController popViewControllerAnimated:YES]; // "Back" } } @end 

मैंने जो हल पाया है, वह बहुत अच्छा नहीं है, लेकिन यह मेरे लिए काम करता है इस उत्तर को लेते हुए, मैं यह भी जांचता हूं कि क्या मैं प्रोग्रामिंग को पॉप-अप कर रहा हूं या नहीं:

 - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; if ((self.isMovingFromParentViewController || self.isBeingDismissed) && !self.isPoppingProgrammatically) { // Do your stuff here } } 

आपको उस प्रॉपर्टी को अपने नियंत्रक में जोड़ना होगा और इसे प्रोग्रामिंग से पहले पॉप करना होगा:

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

ऐसा करने का नया तरीका मिला:

उद्देश्य सी

 - (void)didMoveToParentViewController:(UIViewController *)parent{ if (parent == NULL) { NSLog(@"Back Pressed"); } } 

तीव्र

 override func didMoveToParentViewController(parent: UIViewController?) { if parent == nil { println("Back Pressed") } } 

@ एकग्रे के जवाब का स्विफ्ट संस्करण

 protocol RequestsNavigationPopVerification { var confirmationTitle: String { get } var confirmationMessage: String { get } } extension RequestsNavigationPopVerification where Self: UIViewController { var confirmationTitle: String { return "Go back?" } var confirmationMessage: String { return "Are you sure?" } } final class NavigationController: UINavigationController { func navigationBar(navigationBar: UINavigationBar, shouldPopItem item: UINavigationItem) -> Bool { guard let requestsPopConfirm = topViewController as? RequestsNavigationPopVerification else { popViewControllerAnimated(true) return true } let alertController = UIAlertController(title: requestsPopConfirm.confirmationTitle, message: requestsPopConfirm.confirmationMessage, preferredStyle: .Alert) alertController.addAction(UIAlertAction(title: "Cancel", style: .Cancel) { _ in dispatch_async(dispatch_get_main_queue(), { let dimmed = navigationBar.subviews.flatMap { $0.alpha < 1 ? $0 : nil } UIView.animateWithDuration(0.25) { dimmed.forEach { $0.alpha = 1 } } }) return }) alertController.addAction(UIAlertAction(title: "Go back", style: .Default) { _ in dispatch_async(dispatch_get_main_queue(), { self.popViewControllerAnimated(true) }) }) presentViewController(alertController, animated: true, completion: nil) return false } } 

अब किसी भी नियंत्रक में, बस RequestsNavigationPopVerification अनुरूप है RequestsNavigationPopVerification और यह व्यवहार डिफ़ॉल्ट रूप से अपनाया गया है।