शीर्षक के बिना UINavigationBar कस्टम बैक बटन


231

मैं बिना शीर्षक के iOS 7 और ऊपर के नेविगेशन बैक बटन को कैसे अनुकूलित कर सकता हूं? (केवल तीर के साथ)

self.navigationItem.leftBarButtonItem = self.editButtonItem;

मैं बस सोच रहा था कि क्या उनके पास कोई स्व.बैकबटन इटेम है;

या

कुछ इस तरह?

self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc]
                   initWithBarButtonSystemItem:UIBarButtonSystemItemBACK 
                   target:self action:@selector(back)];

3
आप कस्टम कलर के साथ और किसी भी टाइटल के बिना शेवरॉन बनाने के लिए @hiroshi उत्तर + नेविगेशन बार टिंटकलर प्रॉपर्टी का उपयोग कर सकते हैं
दिमित्री झूकोव

उन लोगों के लिए जिनके पास टैब बार है, और आपको बैक बटन का पाठ नहीं चाहिए, फिक्स है: TabBarController के viewDidLoad () में: self.navigationItem.backBarButtonItem = UIBarButtonItem (शीर्षक: "", style:। सादा, लक्ष्य: शून्य, क्रिया: शून्य)
बोरज़ जूल

जवाबों:


313

यह वास्तव में बहुत आसान है, यहाँ मैं क्या कर रहा हूँ:

उद्देश्य सी

// Set this in every view controller so that the back button displays back instead of the root view controller name
self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];

स्विफ्ट 2

self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .Plain, target: nil, action: nil)

स्विफ्ट 3

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

इस लाइन को व्यू कंट्रोलर में डालें जो स्टैक ( पिछले व्यू कंट्रोलर ) पर जोर दे रहा है । नया धक्का दिया गया व्यू कंट्रोलर बैक बटन अब initWithTitle के लिए जो भी आपके सामने आएगा, जो इस मामले में एक खाली स्ट्रिंग है।


3
मैंने इसका इस्तेमाल किया लेकिन शीर्षक आता है और एक एनिमेटेड फैशन में गायब हो जाता है ??
user1010819

7
धन्यवाद काइल! मैं iOS 7 में डिफ़ॉल्ट बैक बटन का नाम बदलने के लिए एक रास्ता खोज रहा हूं। मैंने इसे अपने prepareForSegueव्यू कंट्रोलर में डाल दिया और इसने पूरी तरह से काम किया।
यिवि

1
@ user1010819 यह अपेक्षित व्यवहार है, दृश्य नियंत्रकों को स्विच करते समय barButtonItems अंदर और बाहर चेतन करेगा। आप क्या खत्म करने की कोशिश कर रहे हैं?
काइल बेगमैन

1
@ यिवीगाओ कोई समस्या नहीं! यह सिर्फ उन चीजों में से एक है जो अगर आपको सही कोड पता है, तो यह बहुत आसान है! मुझे खुशी है कि इसने मदद की!
काइल बेगमैन

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

198

मुझे iOS सिंगल एरो के साथ अपना बैक बटन बनाने का एक आसान तरीका मिला।

आइए देखें कि आपके पास ViewB से ViewA पर जाने वाला एक नेविगेशन नियंत्रक है। आईबी में, ViewA के नेविगेशन बार का चयन करें, आपको इन विकल्पों को देखना चाहिए: शीर्षक, प्रॉम्प्ट और बैक बटन।

ViewA बार विकल्पों पर नेविगेट करें

ViewA बार विकल्पों पर नेविगेट करें

चाल पिछले दृश्य नियंत्रक (देखें ए) के विकल्पों में अपना भाग्य दृश्य नियंत्रक बैक बटन शीर्षक (ViewB ) चुनें। यदि आप विकल्प "बैक बटन" नहीं भरते हैं, तो iOS "बैक" शीर्षक को स्वचालित रूप से पिछले व्यू कंट्रोलर के शीर्षक के साथ डाल देगा । तो, आपको इस विकल्प को एकल स्थान के साथ भरना होगा।

"बैक बटन" विकल्प में स्थान भरें

"बैक बटन" विकल्प में स्थान भरें

परिणाम:

परिणाम:


ढेर अतिप्रवाह में आपका स्वागत है । आप पहले से ही नहीं है, तो क्या हम पर एक नज़र डालें दौरे , और में कुछ लेखों को पढ़ने के लिए सहायता केंद्र के बारे में हम कैसे काम करते हैं और समुदाय सीमा यहाँ हैं। यदि आपको साइट के कार्यों के लिए किसी भी मदद की आवश्यकता है, तो खोज करने से डरो मत, फिर मेटा स्टैक ओवरफ्लो पर एक प्रश्न पूछें (यदि आपको अभी भी उत्तर नहीं मिला है)। धन्यवाद, और शुभकामनाएँ! वैसे भी, अब आप अपनी छवियों को पोस्ट कर सकते हैं ... :)
Qantas 94 भारी

53
यह काम करता है, बस ध्यान दें - आपको पिछले नियंत्रक के लिए "बैक बटन" सेट करने की आवश्यकता है (जैसे कि आपके नेविगेशन नियंत्रक में rootViewController के लिए)
evfemist

सुनिश्चित करें कि आप की जरूरत नहीं है "hidesBackButton" ViewA में नेविगेशन आइटम पर सही पर सेट
शिम

यह मुझे प्रतीत होता है कि यह काम करता है यदि प्रस्तुतकर्ता का शीर्षक काफी लंबा है - यदि यह एक छोटा शीर्षक है तो इसका उपयोग किया जाएगा।
अमेरिकन

1
मेरे लिए यह केवल तभी काम करता है जब ViewController के NavigationItem ने स्रोत और गंतव्य दोनोंBack Button को एक एकल स्थान वर्ण पर सेट किया है (यानी ViewA और ViewB दोनों)
dariariari

72

बस एक छवि का उपयोग करें!

OBJ-C :

- (void)viewDidLoad {
     [super viewDidLoad];
     UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"Icon-Back"]
                                                                                        style:UIBarButtonItemStylePlain
                                                                                       target:self.navigationController
                                                                                       action:@selector(popViewControllerAnimated:)];
     self.navigationItem.leftBarButtonItem = backButton;
}

स्विफ्ट 4 :

let backBTN = UIBarButtonItem(image: UIImage(named: "Back"), 
                              style: .plain, 
                              target: navigationController, 
                              action: #selector(UINavigationController.popViewController(animated:)))
navigationItem.leftBarButtonItem = backBTN
navigationController?.interactivePopGestureRecognizer?.delegate = self

चिह्न-Back.png

चिह्न-पीछे

Icon-Back@2x.png

चिह्न-पीछे @ 2x

Icon-Back@3x.png

चिह्न-पीछे @ 23x


4
इस समाधान के साथ आप "वापस जाने के लिए स्वाइप" कार्यक्षमता ढीली करने लगते हैं।
j7nn7k

16
navigationController?.interactivePopGestureRecognizer?.delegate = selfस्वाइप बैक जेस्चर रखने की ट्रिक है
विक्टर कार्मोज़े

मैं इस जवाब के लिए खोज रहा हूं, शायद मेरी सारी जिंदगी, यानी एक्शन सिलेक्टर।
देस

29

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

-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
      self.navigationItem.backBarButtonItem=[[UIBarButtonItem alloc] initWithTitle:@"NEW TITLE" style:UIBarButtonItemStylePlain target:nil action:nil];
}

यह डिफ़ॉल्ट "बैक" टेक्स्ट को बदल देगा, लेकिन iOS7 स्टाइल को बैक एरो रखेगा। दृश्य को पुश करने से पहले आप पीछे के तीर के लिए रंग भी बदल सकते हैं:

- (void)viewDidLoad{
     //NavBar background color:
     self.navigationController.navigationBar.barTintColor=[UIColor redColor];
//NavBar tint color for elements:
     self.navigationController.navigationBar.tintColor=[UIColor whiteColor];
}

आशा है कि यह आपकी मदद करता है!


2
यह वास्तव में अच्छी तरह से काम करता है और अन्य विकल्पों की तुलना में बेहतर लगता है। उदाहरण के लिए, शीर्षक को कुछ अन्य उत्तरों के विपरीत, पिछले मूल्य पर रीसेट करने की आवश्यकता नहीं है।
pr1001

26

ज्यादा कुछ करने की जरूरत नहीं है। आप स्टोरीबोर्ड के माध्यम से ही इसे प्राप्त कर सकते हैं।

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

नीचे दिए गए चित्र के अनुसार।  यह iOS 7 और iOS 8 के लिए काम करता है


मैंने कोशिश की है, यह काम करता है। लेकिन मैं अभी भी कोड में शीर्षक नहीं बदल सकता।
यू-लिन वांग

XCode7 के साथ काम किया, लेकिन xCode8 में अब और काम नहीं करता है -> ios10.X, मैंने @iwasrobbed विधि का उपयोग किया है
LucioB

सभी प्रतिभा सरल है!
इलिया क्रिट

22

जबकि काइल बेगमिन का जवाब पूरी तरह से चालबाजी करता है, इस कोड को हर दृश्य नियंत्रक में संभव होना काफी कष्टप्रद है। मैं एक साधारण UINavigationItemश्रेणी के साथ समाप्त हुआ । खबरदार, यहाँ ड्रेगन हो! क्षमा करें, मेरा मतलब है, झूलना:

#import <objc/runtime.h>

@implementation UINavigationItem (ArrowBackButton)

static char kArrowBackButtonKey;

+ (void)load {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        Method m1 = class_getInstanceMethod(self, @selector(backBarButtonItem));
        Method m2 = class_getInstanceMethod(self, @selector(arrowBackButton_backBarButtonItem));
        method_exchangeImplementations(m1, m2);
    });
}

- (UIBarButtonItem *)arrowBackButton_backBarButtonItem {
    UIBarButtonItem *item = [self arrowBackButton_backBarButtonItem];
    if (item) {
        return item;
    }

    item = objc_getAssociatedObject(self, &kArrowBackButtonKey);
    if (!item) {
        item = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStyleBordered target:nil action:NULL];
        objc_setAssociatedObject(self, &kArrowBackButtonKey, item, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    }
    return item;
}

@end

1
मैंने उकसाया, लेकिन फिर इसके बजाय एक सरल हैक का उपयोग करने का फैसला किया - [[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(-1000, -1000) forBarMetrics:UIBarMetricsDefault]; ( स्रोत ) - थोड़ा कम सुरुचिपूर्ण हो सकता है, लेकिन झपकी लेना overkill की तरह महसूस किया
dmur

2
गंभीरता से y'all ... पास किसी भी अन्य समाधान पर मत जाओ। समाधान को लागू करें @nicky एक श्रेणी के रूप में पोस्ट किया गया और दो बार मत सोचो। यह एक शानदार पुन: प्रयोज्य समाधान है जिसे यदि आप इस Prefix.pch फ़ाइल को जोड़ते हैं तो ऐप को लागू किया जा सकता है। Apple मौजूदा वर्गों के तरीकों को जोड़ने के लिए श्रेणियों का उपयोग करने के लिए प्रोत्साहित करता है जब आपको संभव हो तो इसका लाभ उठाना चाहिए।
zmonteca

मेरी राय में यह सबसे अच्छा समाधान है, वैसे भी "method_exchangeImplementation" थोड़ा असुरक्षित है, इस पर एक नज़र डालें: स्विज़ करने का सही तरीका और यह NSHipster स्विज़लिंग गाइड
एलेसेंड्रो ओरियो

@ AlessandroOrrù इस विशेष मामले में, यह सुरक्षित होना चाहिए क्योंकि स्विज़ल्ड विधि UINavigationItemबहुत ही स्वयं की विधि है, इसमें कोई विरासत शामिल नहीं है। और _cmdएक गैटर में शामिल होने की बहुत संभावना नहीं है। वैसे भी, यह एक अच्छी बात है। तो y'all, यदि आपके पास आपके प्रोजेक्ट में इन कई स्विज़लिंग हेल्पर्स हैं, तो सुनिश्चित करें कि आप इसका उपयोग यहां भी करते हैं।
दूसरी अनुकंपा

21

संपादित करें: 2014-04-09: जैसा कि मैंने प्रतिष्ठा प्राप्त की है, मुझे खेद है क्योंकि मैं इस चाल का उपयोग नहीं करता हूं। मैं काइल के जवाब की सिफारिश करता हूं। इसके अलावा सूचना है कि selfके self.navigationItem.backBarButtonItemदृश्य नियंत्रक वापस बटन प्रदर्शित किया जाता है नहीं है, लेकिन पिछले दृश्य नियंत्रक होने के लिए वापस चला गया।

यदि आपको पिछले दृश्य नियंत्रक के लिए शीर्षक पाठ की आवश्यकता नहीं है, तो बस रिक्त स्ट्रिंग के साथ शीर्षक भरें;

self.navigationItem.title = @"";
[self.navigationController pushViewController:viewController animated:YES];

यह धक्का दिए गए कंट्रोलर पर शेवरॉन के साथ "बैक" दिखाने से रोकेगा।

संपादित करें: यहां तक ​​कि आप गैर-रिक्त शीर्षक पाठ का उपयोग करते हैं, पिछले दृश्य नियंत्रक viewWillAppear:के शीर्षक को कार्यों में सेट करते हैं, शीर्षक को छोड़कर पलक झपकते ही तब नियंत्रित होता है जब दृश्य नियंत्रक पॉप होता है। मुझे लगता है कि "ट्विटर ऐप" झिलमिलाहट से बचने के लिए अधिक सूक्ष्म हैक करने के लिए लगता है।


मुझे यहाँ केवल एक समस्या यह थी कि जब मैंने पिछली बार के शीर्षक पर वापस जाने के लिए नेविगेशन बार को मारा तो वह खाली हो गया। उस के आसपास कोई रास्ता?
अलियो

@ एलियो ने क्या आपने "EDIT" लाइन में उल्लेख किया है?
हिरोशी

20

यह काम करता है, लेकिन यह पिछले आइटम का शीर्षक हटा देगा, भले ही आप इसे वापस पॉप करें:

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

बस इस संपत्ति को viewDidLoadपुश व्यू कंट्रोलर पर सेट करें ।


17
यह पिछले आइटम का शीर्षक हटा देगा, भले ही आप इसे वापस पॉप करें। बहुत अच्छा नहीं :(
अंटी

मैं वीसी को धक्का देने का शीर्षक सेट करता हूं, viewWillAppearइसलिए यह हमेशा ठीक से सेट होता है।
गुटो आराजू

@GutoAraujo यह काम करता है लेकिन शीर्षक 1 या 2 सेकंड देरी चुड़ैल के साथ फिर से दिखाई देता है UX को यह अच्छा नहीं बनाता है।
फुइइइ जूल

XCode8 में -> ios10.X इस मुद्दे को संबोधित करने का एकमात्र तरीका है
LucioB

12

यह है कि मैं इसे कैसे करता हूं और इसे करने का सबसे सरल, काम करता है और सबसे स्पष्ट तरीका है।

यह काम करता है अगर पर एम्बेड करें Navigation Controller

स्विफ्ट 3

में viewDidLoadमैं दृश्य नियंत्रक में जोड़ना आप वापस बटन बस तीर होना चाहते हैं।

if let topItem = self.navigationController?.navigationBar.topItem {
   topItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}

इस बात का फर्क @Kyle बेगमैन के जवाब में है कि आप इसे व्यू कंट्रोलर पर कॉल करते हैं, जिसे आप चाहते हैं कि बैक बटन सिर्फ एरो हो, न कि स्टैक व्यू व्यू कंट्रोलर पर।


7

जिस तरह से आप चाहते हैं, उसके साथ आपके पास नेविगेशन backButtonItem तक पहुंच नहीं है, आपको नीचे की तरह अपना स्वयं का बैक बटन बनाने की आवश्यकता है:

- (void)loadView
{
    [super loadView];
    UIButton *backButton = [[UIButton alloc] initWithFrame: CGRectMake(0, 0, 44.0f, 30.0f)];
    [backButton setImage:[UIImage imageNamed:@"back.png"]  forState:UIControlStateNormal];
    [backButton addTarget:self action:@selector(popVC) forControlEvents:UIControlEventTouchUpInside];
    self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:backButton];
}

और ऑफ कोर्स:

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

फिर हमने बैक फेड बटन पर अच्छा फीका आउट एनीमेशन खो दिया
किडो

3
चिकनी संक्रमण के लिए आपको मास्क की आवश्यकता होती है। * "यदि आप डिफ़ॉल्ट शेवरॉन को बदलने के लिए एक कस्टम छवि का उपयोग करना चाहते हैं, तो आपको एक कस्टम मास्क छवि बनाने की भी आवश्यकता है। iOS 7 पिछली स्क्रीन के शीर्षक से प्रकट होने के लिए मास्क का उपयोग करता है - या नेविगेशन के दौरान शेवरॉन गायब हो जाता है। संक्रमण। "
उपयोगकर्ता

3
@ आप iOS 7 के साइड-टू-साइड स्वाइप जेस्चर खो देंगे!
माज़ेन कासेर

@user मुझे कस्टम छवि मिलती है लेकिन टिंट का रंग डिफ़ॉल्ट रूप से नीला है। मैं कोई टिंट कैसे जोड़ सकता हूं? धन्यवाद
माज़ेन कासर

7

लक्ष्य:UINavigationBar सफेद आइकन पर सभी बैक बटन को कस्टमाइज़करना

चरण: 1. AppDelete की विधि "didFinishLaunchingWithOptions" में did

UIImage *backBtnIcon = [UIImage imageNamed:@"navBackBtn"];


if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) {
    [UINavigationBar appearance].tintColor = [UIColor whiteColor];
    [UINavigationBar appearance].backIndicatorImage = backBtnIcon;
    [UINavigationBar appearance].backIndicatorTransitionMaskImage = backBtnIcon;
}else{

    UIImage *backButtonImage = [backBtnIcon resizableImageWithCapInsets:UIEdgeInsetsMake(0, backBtnIcon.size.width - 1, 0, 0)];
    [[UIBarButtonItem appearance] setBackButtonBackgroundImage:backButtonImage  forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];

    [[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -backButtonImage.size.height*2) forBarMetrics:UIBarMetricsDefault];
}

2. viewDidLoadसामान्य सुपर ViewControllerक्लास की विधि :

 if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) {
        UIBarButtonItem *backItem = [[UIBarButtonItem alloc] initWithTitle:@""
                                                                     style:UIBarButtonItemStylePlain
                                                                    target:nil
                                                                    action:nil];
        [self.navigationItem setBackBarButtonItem:backItem];
    }else{
        //do nothing
    }

यह C99 में अमान्य "SYSTEM_VESION _..." का एक चेतावनी संस्करण दिखाता है।
जयप्रकाश दुबे

7

स्विफ्ट 4

कस्टम बैक बटन बनाने के इच्छुक लोगों के लिए और साथ ही उनके शीर्षक को हटा दिया गया है, कृपया उस कोड के निम्नलिखित टुकड़े का उपयोग करें जो नए नियंत्रक को धक्का दे रहा है:

self.navigationController?.navigationBar.backIndicatorImage = UIImage(named: "close")
self.navigationController?.navigationBar.backIndicatorTransitionMaskImage = UIImage(named: "close")
self.navigationItem?.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)

अधिक सार्वभौमिक उपयोग के लिए, निम्न कार्य करें:

  1. एक सार्वभौमिक कार्य इस प्रकार बनाएँ:

    func addCustomizedBackBtn(navigationController: UINavigationController?, navigationItem: UINavigationItem?) {
        navigationController?.navigationBar.backIndicatorImage = UIImage(named: "close")
        navigationController?.navigationBar.backIndicatorTransitionMaskImage = UIImage(named: "close")
        navigationItem?.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
    }
  2. फिर इसे निम्नानुसार देखने वाले नियंत्रकों में उपयोग करें:

    addCustomizedBackBtn(navigationController: self.navigationController, navigationItem: self.navigationItem)

6

IOS6 से सरल हैक iOS7 पर भी काम करता है:

[UIBarButtonItem.appearance setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -60) forBarMetrics:UIBarMetricsDefault];

संपादित करें: इस हैक का उपयोग न करें। विवरण के लिए टिप्पणी देखें।


6
इस हैक का उपयोग न करें। 64 बिट उपकरणों पर ऐप्पल के कोड में एक बग है जो बार बटन शीर्षक ऑफसेट करने पर मोडल विचारों को प्रकट होने से रोक देगा। अधिक जानकारी
ज़ी।

वैसे डिवाइस पर केवल समस्याएं थीं, सिम्युलेटर नहीं।
ज़ी।

यह हैक अब काम नहीं करता है जब Xcode 9 / iOS 11 के साथ बनाया जाता है। "<" बहुत कम दिखाई देगा और आप डिबगर में चलने पर टूटी हुई बाधाओं को देखेंगे।
T'Pol

3

आप इसका उपयोग कर सकते हैं। यह मेरे लिए पूरी तरह से काम करता है बस के UIButtonलिए एक हिरासत के रूप में जोड़कर UIBarButtonItem

नीचे दिए गए कोड का प्रयास करें

    self.navigationItem.leftBarButtonItem=[self backButton];


- (UIBarButtonItem *)backButton
{
    UIImage *image = [UIImage imageNamed:@"back-btn.png"];
    CGRect buttonFrame = CGRectMake(0, 0, image.size.width, image.size.height);

    UIButton *button = [[UIButton alloc] initWithFrame:buttonFrame];
    [button addTarget:self action:@selector(backButtonPressed) forControlEvents:UIControlEventTouchUpInside];
    [button setImage:image forState:UIControlStateNormal];

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

    return item;
}

3
हालाँकि, यह iOS 7 में उपयोगकर्ता स्वाइप बैक जेस्चर को निष्क्रिय कर देगा
user102008

3

UILabelअपने मूल दृश्य नियंत्रक के लिए इच्छित शीर्षक से बनाएं और इसे दृश्य नियंत्रक को असाइन करें navigationItem.titleView

अब शीर्षक को एक रिक्त स्ट्रिंग पर सेट करें और अगला दृश्य नियंत्रक जिसे आप धक्का देते हैं, जिसमें पाठ के बिना एक बैक बटन होगा।

self.navigationItem.titleView = titleLabel; //Assuming you've created titleLabel above
self.title = @"";

3
 // add left bar button item

try this code:

- (void)viewDidLoad
{ 
    [super viewDidLoad];

   UIImage* image_back = [UIImage imageNamed:@"your_leftarrowImage.png"];
    CGRect backframe = CGRectMake(250, 9, 15,21);
    UIButton *backbutton = [[UIButton alloc] initWithFrame:backframe];
    [backbutton setBackgroundImage:image_back forState:UIControlStateNormal];
    [backbutton addTarget:self action:@selector(Btn_back:)
         forControlEvents:UIControlEventTouchUpInside];
    [backbutton setShowsTouchWhenHighlighted:YES];
    UIBarButtonItem *backbarbutton =[[UIBarButtonItem alloc] initWithCustomView:backbutton];
    self.navigationItem.leftBarButtonItem=backbarbutton;
    [backbutton release];

}
-(IBAction)Btn_back:(id)sender
{
    [self.navigationController popViewControllerAnimated:YES];

}

3

सभी उत्तर समस्या का समाधान नहीं करते हैं। यह हर व्यू कंट्रोलर में बैक बटन टाइटल सेट करने के लिए स्वीकार्य नहीं है और टाइटल में ऑफ़सेट जोड़ने से अगली व्यू कंट्रोलर टाइटल दाईं ओर शिफ्ट हो जाती है।

यहाँ विधि स्विज़लिंग का उपयोग करने की विधि है, बस UINavigationItem के लिए नया विस्तार बनाएं

import UIKit

extension UINavigationItem {
    public override class func initialize() {

    struct Static {
        static var token: dispatch_once_t = 0
    }

    // make sure this isn't a subclass
    if self !== UINavigationItem.self {
        return
    }

    dispatch_once(&Static.token) {
        let originalSelector = Selector("backBarButtonItem")
        let swizzledSelector = #selector(UINavigationItem.noTitleBackBarButtonItem)

        let originalMethod = class_getInstanceMethod(self, originalSelector)
        let swizzledMethod = class_getInstanceMethod(self, swizzledSelector)

        let didAddMethod = class_addMethod(self, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod))

        if didAddMethod {
            class_replaceMethod(self, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod))
        } else {
            method_exchangeImplementations(originalMethod, swizzledMethod)
        }
    }
}

// MARK: - Method Swizzling

struct AssociatedKeys {
    static var ArrowBackButtonKey = "noTitleArrowBackButtonKey"
}

func noTitleBackBarButtonItem() -> UIBarButtonItem? {
    if let item = self.noTitleBackBarButtonItem() {
        return item
    }

    if let item = objc_getAssociatedObject(self, &AssociatedKeys.ArrowBackButtonKey) as? UIBarButtonItem {
        return item
    } else {
        let newItem = UIBarButtonItem(title: " ", style: UIBarButtonItemStyle.Plain, target: nil, action: nil)
        objc_setAssociatedObject(self, &AssociatedKeys.ArrowBackButtonKey, newItem as UIBarButtonItem?, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
        return newItem
    }
}
}

बैक बटन को वापस शब्द पर सेट करें, महान काम करता है: self.navigationItem.backBarButtonItem.title = @ "बैक";
माइक ज़रील

तुम्हारा मतलब क्या है दोस्त? सवाल बैक बटन से टेक्स्ट हटाने को लेकर था?
याकूब वोलांस्की

1
बहुत सारे ऐप और ऐप्पल के खुद के ऐप "<पीछे" कहते हैं, इसलिए मानक के अनुसार रहना अच्छा है। BigTakeAway और JustEat।
माइक ज़रील

2

मैंने viewDidLoad में निम्नलिखित कोड लागू किया है और यह काम करता है:

  // this will set the back button title
self.navigationController.navigationBar.topItem.title = @"Test";

 // this line set the back button and default icon color  

//[[self.navigationController.navigationBar.subviews lastObject] setTintColor:[UIColor blackColor]];

this line change the back default icon to your custom icon
[[self.navigationController.navigationBar.subviews lastObject] setTintColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"menuicon"]]];

बस अद्यतन करने के लिए मैं वेक्टर आइकन का उपयोग करता हूं


2

आप UINavigationController को उप-वर्ग कर सकते हैं, खुद को प्रतिनिधि के रूप में सेट कर सकते हैं, और प्रतिनिधि विधि में BackBarButtonItem सेट कर सकते हैं navigationController:willShowViewController:animated:

@interface Custom_NavigationController : UINavigationController <UINavigationControllerDelegate>

@end

@implementation Custom_NavigationController

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.delegate = self;
}

#pragma mark - UINavigationControllerDelegate

- (void)navigationController:(UINavigationController *)navigationController     willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    viewController.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];
}

@end

2

खाली शीर्षक सेट करें

UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@""  style:UIBarButtonItemStyleDone target:self action:@selector(handleBack:)];
[backButton setTintColor:Color_WHITE];
[self.navigationItem setBackBarButtonItem:backButton];

बैक इमेज बदलें

 UIImage *backImg = [[UIImage imageNamed:@"ic_back_white"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
[UINavigationBar appearance].backIndicatorImage = backImg;
[UINavigationBar appearance].backIndicatorTransitionMaskImage = backImg;

1

मैं इस समाधान का उपयोग iOS 5 या तो बिना किसी समस्या के कर रहा हूं। मैंने एक उपयोगिता फ़ंक्शन बनाया जिसे मैं अपने दृश्य नियंत्रकों में कॉल करता हूं। आपको इसे या तो ViewDidLoad या उसके बाद किसी बिंदु पर करने की आवश्यकता है।

void updateBackButtonTextForViewController(UIViewController *viewController, NSString *text)
{
    if(! viewController.navigationItem.backBarButtonItem)
    {
        viewController.navigationItem.backBarButtonItem =
        [[UIBarButtonItem alloc] initWithTitle:text
                                         style:UIBarButtonItemStylePlain
                                        target:nil action:nil];
    }
    else
    {
        viewController.navigationItem.backBarButtonItem.title = text;
    }
}

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


1
यह सही जवाब है। कोई तरकीब नहीं। यह सिर्फ iOS API का उपयोग कर रहा है जिस तरह से इसका उपयोग करना था, शीर्षक सेट करने के लिए। शीर्षक को निकालने के लिए इसे "" पर सेट करें (परीक्षण और ठीक काम करता है)।
n13

1

मेरे लिए काम करने का एकमात्र तरीका था:

navigationController?.navigationBar.backItem?.title = ""

अपडेट करें:

जब मैंने सेग एनीमेशन एनीमेशन को सच में बदल दिया (यह पहले गलत था), मेरे लिए काम करने का एकमात्र तरीका था:

navigationController?.navigationBar.topItem?.title = ""

1

यदि आपके पास नेविगेशन कंट्रोलर में दो ViewController (FirstVC, SecondVC) एंबेड हैं, और आप चाहते हैं कि सेकंड वीवीसी में केवल बैक एरो हो।

आप इसे FirstVC के ViewDidLoad में आज़मा सकते हैं

override func viewDidLoad() {
    super.viewDidLoad()
    self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .Plain, target: nil, action: nil)
}

फिर जब आप SecondVC में धक्का देते हैं, तो आप देखेंगे कि केवल बैक एरो है


1

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

https://developer.apple.com/library/content/documentation/UserExperience/Conceptual/UIKitUICatalog/index.html#//apple_ref/doc/uid/TP40012857-UIView-SW7

UINavigationItem *navItem = [[UINavigationItem alloc] init];
   navBar.tintColor = self.tintColor;

   UIImage *myImage = [UIImage imageNamed:@"left_arrow.png"];
     myImage = [myImage              imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];

     UIBarButtonItem *leftButton = [[UIBarButtonItem alloc] initWithImage:myImage style:UIBarButtonItemStylePlain target:self action:@selector(cancelButtonFunction:)];
     navItem.leftBarButtonItem = leftButton;

    navBar.items = @[ navItem ];


1

मैंने इसे आसान बनाने के लिए एक एक्सटेंशन लिखा है:

extension UIViewController {

    /// Convenience for setting the back button, which will be used on any view controller that this one pushes onto the stack
    @objc var backButtonTitle: String? {
        get {
            return navigationItem.backBarButtonItem?.title
        }
        set {
            if let existingBackBarButtonItem = navigationItem.backBarButtonItem {
                existingBackBarButtonItem.title = newValue
            }
            else {
                let newNavigationItem = UIBarButtonItem(title: newValue, style:.plain, target: nil, action: nil)
                navigationItem.backBarButtonItem = newNavigationItem
            }
        }
    }

}

1

आप ViewWillDisappear पर वर्तमान ViewController के शीर्षक को "" में बदल सकते हैं, और जब यह फिर से दिखाना है तो शीर्षक को फिर से सेट करें जो पहले था।

-(void) viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    self.title = @"Previous Title";
}

-(void) viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    self.title = @"";
}

0

तैयारफॉरसेग्यूग में: आपके पहले व्यूकंट्रोलर की विधि से आप उस व्यू टाइटल को @ "" सेट करते हैं, इसलिए जब अगला व्यू होगा तो वह पिछले व्यू कॉन्ट्रोलर टाइटल को प्रदर्शित करेगा जो कि "" होगा।

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
    self.navigationItem.title = @" ";
}

इसके साथ एकमात्र समस्या यह है कि जब आप पिछला बटन दबाते हैं तो आपके पिछले दृश्य का शीर्षक नहीं होगा, इसलिए आप इसे दोबारा जोड़ सकते हैं

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

मुझे यह समाधान बहुत पसंद नहीं है, लेकिन यह काम करता है और मुझे इसे करने का कोई अन्य तरीका नहीं मिला।


नेविगेशन आइटम शीर्षक के साथ गड़बड़ किए बिना सही समाधान के लिए मेरा जवाब देखें।
दिमा

क्या आपका समाधान iOS7 बैक एरो रखता है? मैंने कुछ इसी तरह की कोशिश की, लेकिन उसने तीर हटा दिया।
अलेजांद्रो फिगुएरोए

यह iOS 7 में बैक एरो रखता है, हाँ। IOS 6 में एक खाली (0 लंबाई) स्ट्रिंग में गुजरने से भी बटन पूरी तरह से हट जाएगा, लेकिन ऐसा करना केवल iOS 7 के लिए वास्तव में अच्छा है
Dima

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

0

ऊपर थॉमस सी के उत्तर को जोड़ने के लिए , कभी-कभी एक ही स्थान डालने से काम नहीं होता है और आपको रिक्त स्थान जोड़ना पड़ता है।

खाली बार बटन

जब आप "नेविगेशन आइटम" के अंतर्गत "बार बटन आइटम" देखेंगे तो आपको पता चल जाएगा कि आप सफल हो गए हैं। यह डॉक्यूमेंट आउटलाइन में है (संपादक-> डॉक्यूमेंट आउटलाइन दिखाएं)। एक बार जब आप उपरोक्त चित्र देखते हैं, तो आप कुछ रिक्त स्थान हटा सकते हैं और देख सकते हैं कि क्या यह अभी भी काम करता है।


0
- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if (self) {
        // Custom initialization
        self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];

    }
    return self; 
}

जैसे काइल बेगमैन करती हैं, आप अपने रूट व्यू कंट्रोलर में ऊपर कोड जोड़ें। सभी उप दृश्य नियंत्रक लागू किया जाएगा। इसके अतिरिक्त, इस initWithCoder: पद्धति को जोड़ते हुए, आप xib, स्टोरीबोर्ड या कोड आधारित दृष्टिकोणों में रूट व्यू कंट्रोलर के लिए शैली लागू कर सकते हैं।

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