2012-01-23 24 views
13

UINavigationController पर बैक बटन दबाए जाने पर मैं एक विधि कैसे कॉल कर सकता हूं। पिछले दृश्य प्रदर्शित होने से पहले मुझे एक विधि कॉल करने में सक्षम होना चाहिए। क्या यह संभव है? यदि ऐसा है तो कृपया कोई यह सलाह दे सकता है कि यह कैसे करें?UINavigationController पर बैक बटन दबाए जाने पर विधि को कैसे कॉल करें? (आईफोन)

उत्तर

15

व्यूविल्ल डिस्प्लेयर के लिए कार्यान्वयन जोड़ने का एक तेज़ समाधान है: विधि। जैसे ही व्यू कंट्रोलर बैक बटन दमन के जवाब में गायब हो जाएगा।

- (void)viewWillDisappear:(BOOL)animated { 
    //... 
    //make you stuff here 
    //... 
} 

एक और समाधान बैक बटन पर एक कस्टम उत्तरदाता जोड़ना है। आप इस प्रकार अपने ViewController के init विधि को संशोधित कर सकते हैं:

- (id)init { 
    if (self = [super init]) { 
     //other your stuff goes here 
     //... 
     //here we customize the target and action for the backBarButtonItem 
     //every navigationController has one of this item automatically configured to pop back 
     self.navigationItem.backBarButtonItem.target = self; 
     self.navigationItem.backBarButtonItem.action = @selector(backButtonDidPressed:); 
    } 
    return self; 
} 

और फिर आप निम्नलिखित के रूप में एक चयनकर्ता विधि का उपयोग कर सकते हैं। सही ढंग से viewController को खारिज करना सुनिश्चित करें, अन्यथा आपका नेविगेशन नियंत्रक वांछित के रूप में पॉप नहीं होगा।

- (void)backButtonDidPressed:(id)aResponder { 
    //do your stuff 
    //but don't forget to dismiss the viewcontroller 
    [self.navigationController popViewControllerAnimated:TRUE]; 
} 
+4

दोनों के बीच एक अंतर यह है कि पहले समाधान (यानी 'viewWillDisappear') को नेविगेशन स्टैक के माध्यम से वापस या आगे जाने पर बुलाया जाता है। दूसरा समाधान सिर्फ वापस जाने के लिए है। – Matthew

+5

यह आम तौर पर काम नहीं करेगा क्योंकि आप पाएंगे कि बैकबटन इटिम शून्य है जब तक कि आप इसे स्पष्ट रूप से एक बटन असाइन नहीं करते। वैसे भी, मेरे अनुभव में, बाएं बार्टबटन इटिम और बैकबर्टनटिम दोनों शून्य थे। – Diziet

+3

यह –

1

कोडकंट्रोलर में कोड डालने का सबसे आसान तरीका होगा जो बैक बटन दबाए जाने पर प्रस्तुत किया जाएगा। आप उपयोग कर सकते हैं viewWillAppear

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 
    //Your code here 
} 

ध्यान दें कि यह भी जब दृश्य किसी अन्य कारण से प्रस्तुत किया है निष्पादित किया जाएगा, ताकि आप यह तो होना ही केवल जब वापस बटन दबाया जाता है आप प्रतिनिधि उपयोग करने के लिए चाहते हैं: UINavigationControllerDelegate

+0

कि विधि है कि कुलपति सब पर प्रकट होता है जब बुलाया जाएगा, बस जरूरी नहीं कि सिर्फ इसे वापस – Colin

+1

के लिए जा रहा @Colin यह सही है, यह सही व्यवहार वह चाहता है पर निर्भर करता है कि वह का एक परिणाम के रूप में प्रतिनिधि का उपयोग कर सकते हैं, अगर वह केवल बैक बटन दबाए जाने पर ही चाहता है। –

6
UIButton *backButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 52, 31)]; 
[backButton setBackgroundImage:[UIImage imageNamed:@"BackButton.png"] forState:UIControlStateNormal]; 
//[backButton setTitle:@"CLOSE" forState:UIControlStateNormal]; 
[backButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; 
[backButton.titleLabel setFont:[UIFont boldSystemFontOfSize:14.0f]]; 
[backButton addTarget:self action:@selector(tappedBackButton:) forControlEvents:UIControlStateHighlighted]; 

UIBarButtonItem* item = [[UIBarButtonItem alloc] initWithCustomView:backButton]; 

self.navigationItem.leftBarButtonItem = item; 
[item release]; 

एक कस्टम बैक बटन बनाएँ और है कि चयनकर्ता एक विधि है कि आप चाहते हैं फोन इस्तेमाल करते हैं। और [self.navigationController popViewControllerAnimated: TRUE] का भी उपयोग करें;

- (void)tappedBackButton:(id)button 
{ 
    // call your method here 
    [self.navigationController popViewControllerAnimated:TRUE]; 
} 
+0

ध्यान दें कि जब आप बैक बटन को इस तरह से प्रतिस्थापित करते हैं, तो आप आईओएस 7 में पेश किए गए बाएं किनारे से "मूल दृश्य नियंत्रक पर वापस जाने के लिए स्वाइप करें" सुविधा खो देते हैं और यह उपयोगी है आईफोन 6 और 6+ –

+0

पर शॉर्टकट यह self.navigationItem.rightBarButtonItem के साथ काम नहीं कर रहा है ... कृपया एक और समाधान दें – Vidhi

6

मुझे लगता है कि मैं एक "क्लीन" तरीका है कि ऐसा करने के लिए मिला:

सबसे पहले,

@interface MyViewController() <UINavigationControllerDelegate> 

फिर UINavigationControllerDelegate प्रोटोकॉल का पालन करने के प्रतिनिधि के रूप में इसे परिभाषित के रूप में अपने दृश्य नियंत्रक सेट

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view. 

    // Set this View Controller as the navigation controller delegate 
    self.navigationController.delegate = self; 

} 

अंतिम, इस विधि का उपयोग UINavigationControllerDeleg से करें खा लिया प्रोटोकॉल:

#pragma mark - Navigation controller delegate 
- (void)willMoveToParentViewController:(UIViewController *)parent 
{ 
    // If there is no parent, then it means that the view controller has been removed from the stack, which happens when the back button has been pressed 
    if (!parent) { 
     NSLog(@"Back button pressed"); 

     // it can be useful to store this into a BOOL property 
     self.backButtonPressed = YES; 
    } 
} 
संबंधित मुद्दे