UINavigationController "बैक बटन" कस्टम पाठ?


147

UINavigationControllerडिफ़ॉल्ट रूप से "बैक बटन" स्टैक में अंतिम दृश्य का शीर्षक दिखाता है। क्या इसके बदले बैक बटन में कस्टम टेक्स्ट करने का कोई तरीका है?


1
मेरे लिए यह कामself.navigationController.navigationBar.topItem.title = @"Custom text";
huync

जवाबों:


342

से इस लिंक :

self.navigationItem.backBarButtonItem =
   [[UIBarButtonItem alloc] initWithTitle:@"Custom Title"
            style:UIBarButtonItemStylePlain
           target:nil
           action:nil];

जैसा कि टायलर ने टिप्पणियों में कहा:

दृश्य व्यू कंट्रोलर में ऐसा न करें, लेकिन व्यू कंट्रोलर में अगर आप बैक बटन दबाते हैं तो आप देखेंगे


4
आपको चाहिये । releaseUIBarButtonItem
मेहरदाद अफश्री

217
ध्यान दें, आपको व्यू कंट्रोलर में यह करने की आवश्यकता है कि स्टैक ऊपर एक स्तर। दूसरे शब्दों में, दृश्य व्यू कंट्रोलर में ऐसा न करें, लेकिन व्यू कंट्रोलर में आप देखेंगे कि आपने बैक बटन मारा है या नहीं।
टायलर

6
बस टायलर की टिप्पणी को स्पष्ट करने के लिए क्योंकि मुझे पहले यह समझ में नहीं आया था: बैकबार्टटन इटेम को एक दृश्य नियंत्रक नेविगेशन में सेट करना। यह बटन सेट कर रहा है जो इस दृश्य नियंत्रक पर वापस जाने के लिए दिखाएगा। यह भी ध्यान दें कि हालांकि तीर बटन के लिए कोई बटन शैली नहीं है, फिर भी इस बटन को तीर शैली मिलेगी। मैंने UIBarButtonItemStylePlain का उपयोग किया है और अभी भी तीर बटन शैली प्राप्त करता हूं।
जॉन स्टीनमेट्ज़

3
सुझाव: शैली मानने के बजाय, वर्तमान में सेट की गई शैली को पास करें। इस उत्तर के कोड में, UIBarButtonItemStyleBorderedकॉल को प्रॉपर्टी से बदलें self.navigationItem.backBarButtonItem.style। दस्तावेज़ीकरण: developer.apple.com/library/ios/documentation/uikit/reference/…
तुलसी बॉर्क

1
ध्यान दें कि एआरसी के तहत आपको ऑटोरेलिज कॉल को छोड़ना होगा। इसलिए आपके पास self.navigationItem.backBarButtonItem = [[UIBarButtonItem आवंटित] initWithTitle: @ "कस्टम शीर्षक" शैली: UIBarButtonItemSemleBordered लक्ष्य: nil action: nil];
bkbeachlabs

43

आप इंटरफ़ेस बिल्डर में पाठ सेट कर सकते हैं:

ViewController के नेविगेशन आइटम का चयन करें जो वापस बटन पर वापस आ जाएगा:

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

यूटिलिटीज पैनल विशेषता निरीक्षक में, बैक बटन के लिए अपना लेबल दर्ज करें:

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

मैं स्वीकार किए गए उत्तर के अनुसार कोड में शीर्षक सेट करने के लिए इस दृष्टिकोण को प्राथमिकता दूंगा।

ध्यान दें, आपको व्यू कंट्रोलर में यह करने की आवश्यकता है कि स्टैक ऊपर एक स्तर। दूसरे शब्दों में, दृश्य व्यू कंट्रोलर में ऐसा न करें, लेकिन व्यू कंट्रोलर में आप देखेंगे कि आपने बैक बटन मारा है या नहीं।
--Tyler


यह अब तक का मुझे मिला सबसे अच्छा जवाब है।
अयन सेनगुप्ता

2
स्पष्ट होने के लिए, यह दृश्य नियंत्रक के नेविगेशन आइटम पर सेट होने की आवश्यकता है, न कि नियंत्रक के गुण निरीक्षक पर।
पैट्रिक

यह मुझे मिला सबसे अच्छा जवाब है।
बाइसेपजई

यह सबसे अच्छा जवाब है
एलेक्स ब्राउन

2
Xcode 6.1.1 के रूप में, और iOS 7 में चल रहा है, ऐसा लगता है कि आपका मूल पिछला शीर्षक शीर्षक STILL को ओवरड्राइड करेगा जो भी आपने यहां सेट किया है। यदि पिछले दृश्य के शीर्षक में 11 वर्णों की सीमा से अधिक है, तो अगले दृश्य का बैक बटन बस "बैक" कहेगा। यहाँ कोई नया तरीका नहीं है सिवाय इसके कि स्क्रैच से एक नया नेवी बार आइटम बनाया जाए जैसा कि यहाँ के टॉप-वोटेड उत्तर में दिखाया गया है।
रे

22

मैं इसका उपयोग करता हूं:

// In the current view controller, not the one that is one level up in the stack
- (void)viewDidLoad {
    [super viewDidLoad];
    self.navigationController.navigationBar.backItem.title = @"Custom text";
}

यह लगभग मेरे लिए काम करता है, लेकिन जब मैं बैक बटन पर क्लिक करता हूं, तो पाठ एनीमेशन की अवधि के लिए माता-पिता के शीर्षक पर वापस बदल जाता है :-(
डैनी टुप्पेनी

3
यह स्टैक में कंट्रोलर के बैक बटन शीर्षक को बदल देता है। यह वर्तमान में प्रदर्शित नियंत्रक के बैक बटन शीर्षक को नहीं बदलता है। इससे भी बदतर: यह पिछले नियंत्रक के पिछले नियंत्रक के शीर्षक को बदल देता है!
लेविथान

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

11

मैंने स्टैक पर किसी अन्य कंट्रोलर को पुश करने से पहले कंट्रोलर के शीर्षक को सेट करके इसका एक आसान हल ढूंढा:

self.navigationItem.title = @"Replacement Title";
[self.navigationController pushViewController:newCtrl animated:YES];

फिर, मूल शीर्षक को viewWillAppearइस तरह सेट करना सुनिश्चित करें:

-(void)viewWillAppear:(BOOL)animated
{
  ...
  self.navigationItem.title = @"Original Title";
  ...
}

यह काम करता है क्योंकि UINavigationControllerएक पुश ऑपरेशन के दौरान बैक बटन का निर्माण करते समय डिफ़ॉल्ट व्यवहार पिछले नियंत्रक से शीर्षक का उपयोग करना है।


1
इसके साथ समस्या यह है कि पुराने दृश्य पर शीर्षक परिवर्तन होता है क्योंकि यह एनिमेट करता है और थोड़ा सा साफ दिखता है। दिए गए समाधानों में से कोई भी यहां काम नहीं करता है जैसा कि आप चाहते हैं :-(
डैनी Tupeny

1
यह मेरी स्थिति में एकदम सही है क्योंकि मैं पिछली स्क्रीन पर NavBar नहीं दिखाता हूं और मैं सिर्फ नए स्क्रीन पर बैक बटन से टाइटलबेल को हटाना चाहता हूं और इसमें सिर्फ iOS7 शेवरॉन एरो है। इसलिए मैं केवल शीर्षक के लिए एक खाली NSString शाब्दिक सेट कर सकता हूं।
siburb

पुश व्यू कंट्रोलर को तब बढ़ाएं जब बैक पर टैप करें
सुमित

7

बैक बटन का शीर्षक पिछले दृश्य के शीर्षक को डिफॉल्ट करता है इसलिए मैं जिस त्वरित चाल का उपयोग करता हूं वह पिछले कोड -m फ़ाइल पर निम्न कोड को रखना है।

-(void)viewWillAppear:(BOOL)animated {

    // Set title
    self.navigationItem.title=@"Original Title";
}

-(void)viewWillDisappear:(BOOL)animated {

    // Set title
    self.navigationItem.title=@"Back";
}

यह कई मामलों के लिए बहुत अच्छी तरह से काम करता है और यह बहुत आसान है ... केवल अवलोकन यह है कि इन विधियों में से किसी एक को ओवरराइड करने के लिए आवश्यक है कि सुपर के कार्यान्वयन को नई विधि में कुछ बिंदु पर बुलाया जाए।
izk

2
इस विधि के साथ, कोई भी पुश एनीमेशन होने से पहले माता-पिता के दृश्य को 'बैक' में बदले जाने की सूचना देगा। (और, सॉर्ट बेकार है, कि अगर आप इसे व्यूडिसडैपियर विधि में स्थानांतरित करते हैं, तो आपको पुश के बाद स्विच दिखाई देगा ..)
जेम्स बूचर

मुझे यह विधि बहुत पसंद है लेकिन इस समस्या का सामना मुझे इस बात से होता है कि "ओरिजिनल टाइटल" ठीक से सेट हो जाता है, लेकिन यह एक दीर्घवृत्त के साथ आता है यदि यह "बैक" से अधिक लंबा है, क्योंकि ऐसा होना चाहिए, क्योंकि व्यू अभी तक पदानुक्रम में नहीं है , यह शीर्षक दृश्य को फिर से जारी नहीं करता है। ऊपर दिए गए प्रारंभिक प्रारंभिक गति के कारण @JamesBoutcher द्वारा वर्णित समस्या मेरे लिए ध्यान देने योग्य नहीं है। वास्तव में, मुझे बस एहसास हुआ कि धीमी गति से समाप्त होने वाले एनीमेशन के कारण मुझे जो समस्या आती है वह विशेष रूप से ध्यान देने योग्य है, जब यह समस्या प्रमुख है।
trss

जबकि stackoverflow.com/questions/1441699/… पर उत्तर आवश्यक से अधिक अनुकूलन की तरह लगता है, यह प्रलेखित तरीका है और अधिक महत्वपूर्ण बात यह है कि यह हमारे इरादे के लिए अधिक गठबंधन है।
trss

6

अपनी init विधि में, निम्न कोड जोड़ें:

- (id)initWithStyle:(UITableViewStyle)style {
    if(self = [super init]) {

        //...

        UIBarButtonItem *customBackButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" 
                                             style:UIBarButtonItemStylePlain 
                                            target:self 
                                            action:@selector(goBack)];
        self.navigationItem.leftBarButtonItem = customBackButton;
        [customBackButton release];

        //...
    }
    return self;
}

फिर एक सरल विधि जोड़ें, व्यूकंट्रोलर को खारिज करने की अनुमति देने के लिए:

-(void)goBack {
    [self.navigationController popViewControllerAnimated:YES];  
}

3

ViewDidLoad या loadView में निम्न कोड जोड़ें

self.navigationController.navigationBar.topItem.title = @"Custom text";

मैंने आईफोन 9 के साथ आईफोन और आईपैड में इसका परीक्षण किया


सेल्फ.नैविगेशन कॉनट्रॉलर होना चाहिए? .NavigationBar.backItem? .Title = "कस्टम टेक्स्ट"
पीसमून

1
केवल अंतर जो मुझे चाहिए था वह था गुणों navigationControllerऔर topItemगुणों पर वैकल्पिक self.navigationController?.navigationBar.topItem?.title = "Custom Text"
चैनिंग

2

पुनर्स्थापना के उत्तर में जोड़ना। ऐप्पल के डॉक्स से ध्यान दें कि बैकबार्टन की घोषणा यह है:

@property(nonatomic, retain) UIBarButtonItem *backBarButtonItem

इसलिए, पुनर्बलन का उत्तर मेमोरी को रिसाव करेगा क्योंकि संश्लेषित सेटर retainआपके द्वारा इसे पारित करने का उदाहरण होगा , जिसे कभी भी स्पष्ट रूप से जारी नहीं किया जाता है। आप इसका उपयोग करके उपाय कर सकते हैंautorelease

 self.navigationItem.backBarButtonItem = 
      [[[UIBarButtonItem alloc] initWithTitle:@"Custom Title" 
         style:UIBarButtonItemStyleBordered
         target:nil
         action:nil] autorelease];  //<-- autoreleased

या आप उदाहरण पर एक चर इंगित कर सकते हैं ताकि आप इसे बाद में स्पष्ट रूप से जारी कर सकें:

UIBarButtonItem* item = ...
self.navigationItem.backBarButtonItem = item;
[item release];

उम्मीद है की यह मदद करेगा!


इन दिनों पर ध्यान दें, एआरसी के साथ, आपको ऑटोरेलिज़ के बारे में चिंता करने की ज़रूरत नहीं है (और वास्तव में संकलक त्रुटि करेगा यदि आप एआरसी-सक्षम प्रोजेक्ट में ऑटोरेलिज़ करने की कोशिश करते हैं)
एरिक गोल्डबर्ग

2
- (void)viewDidLoad {
  [super viewDidLoad];

  UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:nil action:nil];
  self.navigationItem.backBarButtonItem = backButton;
  [backButton release];
}

2

मैंने कुछ दिलचस्प खोजा है। यदि आप विधि को उप-विभाजित करते हैं UINavigationControllerऔर pushViewController:animated:विधि को ओवरराइड करते हैं और ऐसा कुछ करते हैं: (ध्यान रखें कि मैं एआरसी का उपयोग कर रहा हूं)

UIBarButtonItem *backButton = [[UIBarButtonItem alloc] 
 initWithTitle: @"Back" 
 style: UIBarButtonItemStyleBordered
 target: nil action: nil];

viewController.navigationItem.backBarButtonItem = backButton;

[super pushViewController:viewController animated:animated];

फिर उन सभी के लिए ViewControllersजिन्हें आपके नेविगेशन कंट्रोलर के साथ धकेला गया है, उनमें "बैक" बटन अपने आप आ जाएगा। यदि आप कुछ निश्चित नियंत्रकों के लिए पाठ को बदलना चाहते हैं, तो आप एक निश्चित वर्ग या अपने स्वयं के कस्टम प्रोटोकॉल के लिए व्यूकंट्रोलर कास्ट कर सकते हैं (जिसमें आपका व्यूकंट्रोलर विरासत में मिलता है, जिसमें से एक तरीका हो सकता है।backButtonText या मूर्खतापूर्ण कुछ ऐसा ) जो आपको दे सकता है sothat में आने वाले viewcontroller के बारे में कुछ जानकारी आप इसके लिए बैक बटन टेक्स्ट को कस्टमाइज़ कर सकते हैं। अब बैक बटन टेक्स्ट को एक ऐसी जगह पर ध्यान दिया जाता है जो पूरी तरह से जिम्मेदारी को पकड़ना चाहिए। मुझे स्वीकार करना होगा कि पाठ को बदलने के लिए एक नया बटन बनाना, लेकिन ओह अच्छी तरह से।

क्या कोई ऐसा कारण सोच सकता है कि वह ऐसा क्यों नहीं करता? कम से कम आपको कम से कम व्यू कॉन्ट्रैक्टर के साथ फिडेल करने की जरूरत नहीं है या नेविगेशन कंट्रोलर पर व्यूकंट्रोलर को पुश करने से पहले एक नया बैक बटन बनाना याद रखना होगा।


0

लगाम का जवाब अच्छी तरह से काम करता है।

ध्यान दें कि यदि आप एक से अधिक व्यू कंट्रोलर को धक्का देते हैं, तो बदले हुए बटन का शीर्षक उनमें से प्रत्येक के लिए दिखाई देगा, जो कि वह नहीं है जो आप चाहते हैं।

उस स्थिति में, आपको हर बार व्यू कंट्रोलर को कस्टम UIBarButtonItem बनाने की आवश्यकता होगी।

इसके अलावा, सुनिश्चित करें कि दृश्य नियंत्रक को धक्का देने से पहले आप इसे कर लें , अन्यथा शीर्षक बदलते ही आपको स्क्रीन हिचकी मिलेगी।


0

ऑब्रे के सुझाव पर विस्तार करते हुए, आप इसे चाइल्ड व्यू कंट्रोलर में कर सकते हैं:

माता-पिता के नेविगेशन के पुराने मूल्यों को संग्रहीत करने के लिए दो चर बनाएं। item.title और माता-पिता के नेविगेशनItem

UINavigationItem* oldItem;
NSString* oldTitle;

में viewDidLoad, निम्नलिखित जोड़ें:

oldItem = self.navigationController.navigationBar.topItem;  
oldTitle = oldItem.title;  
[oldItem setTitle: @"Back"];  

में viewWillDisappear, निम्नलिखित जोड़ें:

[oldItem setTitle: oldTitle];  
oldTitle = nil;  // do this if you have retained oldTitle
oldItem = nil;   // do this if you have retained oldItem

यह सही नहीं है। आप देखेंगे कि नए नियंत्रक के रूप में मूल दृश्य परिवर्तन का शीर्षक एनिमेटेड है। लेकिन यह बैक बटन के कस्टम लेबलिंग के लक्ष्य को प्राप्त करता है और इसे मानक बैक बटन की तरह आकार में रखता है।


0

viewDidLoadइसे आप में डालिए , आशा है कि यह वही होगा जो आप खोज रहे हैं

UIBarButtonItem *backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Close" 
style:UIBarButtonItemStylePlain target:nil action:nil];
self.navigationItem.backBarButtonItem = backBarButtonItem;
[backBarButtonItem release];

0

अगर आप स्विफ्ट 3 में ARRIVING कंट्रोलर (कभी-कभी अधिक तर्क ..) में शीर्षक सेट करना चाहते हैं:

func setBackButtonNavBar(title: String, delay: Double){

    let when = DispatchTime.now() + delay
    DispatchQueue.main.asyncAfter(deadline: when, execute: { () -> Void in

        if let navBar = self.navigationController?.navigationBar{
            navBar.backItem?.title = title
        }
    })

}

आगामी नियंत्रक में:

override func viewDidLoad() {
    super.viewDidLoad()
    self.setBackButtonNavBar(title: "back", delay: 0.3)
}

आमतौर पर मैं एक नियंत्रक एक्सटेंशन में self.setBackButtonNavBar डालता हूं।


0

मुझे पता है कि यह एक पुराना सवाल है और जवाब 'अपडेटेड आउट' है!

माता-पिता में ऐसा करने का आसान तरीका ViewController:

यानी वह जो आपको अगले व्यू कंट्रोलर तक ले जाए।

self.navigationItem.backBarButtonItem  = UIBarButtonItem(title: "Custom text here", style: .plain, target: nil, action: nil)

-1

कोड में ऐसा करने से बैक बटन शैली को हटा दिया जाता है UINavigationConroller। यदि आप अपने प्रत्येक दृश्य में एक नेविगेशन आइटम जोड़ते हैं, तो आप बैक बॉटलन का शीर्षक सेट कर सकते हैं StoryBoard

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.