UINavigationController के लिए एक सही बटन कैसे जोड़ें?


191

मैं बिना किसी सफलता के एक नेविगेशन नियंत्रक के शीर्ष बार में एक ताज़ा बटन जोड़ने की कोशिश कर रहा हूं।

यहाँ हैडर है:

@interface PropertyViewController : UINavigationController {

}

यहाँ मैं इसे जोड़ने की कोशिश कर रहा हूँ:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
        UIBarButtonItem *anotherButton = [[UIBarButtonItem alloc] initWithTitle:@"Show" style:UIBarButtonItemStylePlain
                                          target:self action:@selector(refreshPropertyList:)];      
        self.navigationItem.rightBarButtonItem = anotherButton;
    }
    return self;
}

जवाबों:


362

इसे देखने की कोशिश करें। आम तौर पर आपको उस बिंदु तक किसी भी चीज़ को तब तक स्थगित करना चाहिए, जब तक कि एक UIViewController के लिए यह आवश्यक नहीं है कि यह अभी भी प्रदर्शित होने से पहले काफी समय हो सकता है, काम जल्दी करने और स्मृति को बांधने का कोई मतलब नहीं है।

- (void)viewDidLoad {
  [super viewDidLoad];

  UIBarButtonItem *anotherButton = [[UIBarButtonItem alloc] initWithTitle:@"Show" style:UIBarButtonItemStylePlain target:self action:@selector(refreshPropertyList:)];          
  self.navigationItem.rightBarButtonItem = anotherButton;
  // exclude the following in ARC projects...
  [anotherButton release];
}

जैसे कि यह वर्तमान में काम क्यों नहीं कर रहा है, मैं अधिक कोड देखे बिना 100% निश्चितता के साथ नहीं कह सकता, लेकिन बहुत सारा सामान init और view loading के बीच होता है, और आप ऐसा कुछ कर सकते हैं जिससे नेविगेशन को रीसेट करना पड़ता है। के बीच।


45
मैं आपको UINavigationController उपवर्ग के बाहर कर रहा हूं, आप इसे इस तरह से संदर्भित करेंगे: someNavController.topLevelController.navigationItem.rightBarButtonItem
अन्य

2
मैं सुझाए गए समाधान को लागू कर रहा था और जब तक मुझे पता नहीं चला कि मेरा एप्लिकेशन दुर्घटनाग्रस्त हो रहा है, तब तक @selector पद्धति का नाम कोलन में समाप्त होना है (:)
स्टेल्थ

10
यहां तक ​​कि एक UINavigationContoller के व्यूडीडलॉड विधि के अंदर, मुझे इसे कॉल करना पड़ा जैसेself.topViewController.navigationItem.leftBarButtonItem = nextButton;
यूसुफ

धन्यवाद! @ जोसेफ, आपके स्पष्टीकरण ने मुझे बचा लिया। (y) :)
प्रसन्ना

38

उस व्यू कंट्रोलर के नेवीगेशन को बटन जोड़ने की कोशिश करें जो PropertyViewControllerआपके द्वारा बनाए गए इस वर्ग पर धकेल दिया जाएगा ।

अर्थात्:

MainViewController *vc = [[MainViewController alloc] initWithNibName:@"MainViewController" bundle:nil];
UIButton *infoButton = [UIButton buttonWithType:UIButtonTypeInfoLight];
[infoButton addTarget:self action:@selector(showInfo) forControlEvents:UIControlEventTouchUpInside];
vc.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc] initWithCustomView:infoButton] autorelease];

PropertyViewController *navController = [[PropertyViewController alloc] initWithRootViewController:vc];

अब, यह जानकारीबटन जिसे प्रोग्रामेटिक रूप से बनाया गया है, नेविगेशन बार में दिखाई देगा। विचार यह है कि नेविगेशन नियंत्रक अपनी प्रदर्शन जानकारी (शीर्षक, बटन आदि) को उसी से उठाता है UIViewControllerजिससे वह प्रदर्शित होने वाला है। आप वास्तव में बटन और ऐसे सीधे नहीं जोड़ते हैं UINavigationController


2
UINavigationController पर सीधे rightBarButtonItem को सेट करना मेरे लिए काम नहीं करता था (जैसा कि ऊपर लुई गेरबर्ग ने प्रस्तावित किया है)। इसके बजाय आइटम सीधे UIViewController पर हाथ की तरह सेट करने पर Adem ने काम करने का सुझाव दिया!
लेविथान

4
+1 के लिए "बटन को जोड़ने की कोशिश करें जो उस व्यू कंट्रोलर के नेवीगेशन पर जा रहा है जिसे पुश किया जा रहा है" !
काजुल

25

ऐसा लगता है कि कुछ लोग (मेरे जैसे) इंटरफ़ेस बिल्डर में नेविगेशन बार बटन जोड़ने की तलाश में यहां आ सकते हैं। नीचे दिए गए जवाब से पता चलता है कि यह कैसे करना है।

अपने स्टोरीबोर्ड में एक नेविगेशन नियंत्रक जोड़ें

अपना व्यू कंट्रोलर चुनें और फिर Xcode मेन्यू में एडिटर> एंबेड इन> नेविगेशन कंट्रोलर चुनें

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

वैकल्पिक रूप से, आप UINavigationBarऑब्जेक्ट लाइब्रेरी से जोड़ सकते हैं ।

एक बार बटन आइटम जोड़ें

UIBarButtonItemऑब्जेक्ट लाइब्रेरी से टॉप नेविगेशन बार तक खींचें ।

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

इसे ऐसा दिखना चाहिए:

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

विशेषताएँ सेट करें

आप टेक्स्ट को "रिफ्रेश" जैसी चीज़ में बदलने के लिए "आइटम" पर डबल-क्लिक कर सकते हैं, लेकिन रीफ़्रेश के लिए एक वास्तविक आइकन है जिसे आप उपयोग कर सकते हैं। सिर्फ़ UIBarButtonItemऔर सिस्टम आइटम के लिए विशेषताएँ निरीक्षक का चयन करें ताज़ा करें चुनें ।

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

यह आपको डिफ़ॉल्ट रीफ़्रेश आइकन देगा।

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

एक IB क्रिया जोड़ें

UIBarButtonItemजोड़ने के लिए व्यू कंट्रोलर से ड्रैग को कंट्रोल करें @IBAction

class ViewController: UIViewController {

    @IBAction func refreshBarButtonItemTap(sender: UIBarButtonItem) {
        
        print("How refreshing!")
    }
    
}

बस।


क्षमा करें, मैं आपके बारे में जो कुछ भी कह रहा हूं, उसका पालन नहीं कर सकता। एक छवि के साथ एक नया प्रश्न बनाने की कोशिश करें जो आपको बता रही है कि आप किस बारे में बात कर रहे हैं। फिर यहां एक लिंक जोड़ें।
सूर्याग

@Surchch, मैं स्टोरीबोर्ड्स के बजाय xib फ़ाइलों के साथ समान चीजें कैसे कर सकता हूं? , धन्यवाद
क्रिस्टियन चपरो ए।

@CristianChaparroA। आमतौर पर xib फाइलें सिंगल व्यू के लिए होती हैं और नेविगेशन बार (जो बार बटन आइटम को होस्ट करता है) मल्टीपल व्यू के लिए होता है। मैंने कभी भी बार बटन आइटम के साथ xib का उपयोग नहीं किया है। आप एक नया सवाल पूछने की कोशिश कर सकते हैं और फिर इसे यहाँ लिंक कर सकते हैं।
सूरगाछ

14

"रिफ्रेश" के लिए एक डिफ़ॉल्ट सिस्टम बटन है:

- (void)viewDidLoad {
    [super viewDidLoad];

    UIBarButtonItem *refreshButton = [[[UIBarButtonItem alloc] 
                            initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh
                            target:self action:@selector(refreshClicked:)] autorelease];
    self.navigationItem.rightBarButtonItem = refreshButton;

}

- (IBAction)refreshClicked:(id)sender {

}

11

आप इसका उपयोग कर सकते हैं:

उद्देश्य सी

UIBarButtonItem *rightSideOptionButton = [[UIBarButtonItem alloc] initWithTitle:@"Right" style:UIBarButtonItemStylePlain target:self action:@selector(rightSideOptionButtonClicked:)];          
self.navigationItem.rightBarButtonItem = rightSideOptionButton;

तीव्र

let rightSideOptionButton = UIBarButtonItem()
rightSideOptionButton.title = "Right"
self.navigationItem.rightBarButtonItem = rightSideOptionButton

6
-(void) viewWillAppear:(BOOL)animated
{

    UIButton *btnRight = [UIButton buttonWithType:UIButtonTypeCustom];
    [btnRight setFrame:CGRectMake(0, 0, 30, 44)];
    [btnRight setImage:[UIImage imageNamed:@"image.png"] forState:UIControlStateNormal];
    [btnRight addTarget:self action:@selector(saveData) forControlEvents:UIControlEventTouchUpInside];
    UIBarButtonItem *barBtnRight = [[UIBarButtonItem alloc] initWithCustomView:btnRight];
    [barBtnRight setTintColor:[UIColor whiteColor]];
    [[[self tabBarController] navigationItem] setRightBarButtonItem:barBtnRight];

}

क्या कोई मुझे बता सकता है कि ViewDillLoad के बजाय ViewWillAppear में इसे करने में कोई नुकसान है
Niranjan Molkeri

6

स्विफ्ट 2 के लिए:

self.title = "Your Title"

var homeButton : UIBarButtonItem = UIBarButtonItem(title: "LeftButtonTitle", style: UIBarButtonItemStyle.Plain, target: self, action: Selector("yourMethod"))

var logButton : UIBarButtonItem = UIBarButtonItem(title: "RigthButtonTitle", style: UIBarButtonItemStyle.Plain, target: self, action: Selector("yourMethod"))

self.navigationItem.leftBarButtonItem = homeButton
self.navigationItem.rightBarButtonItem = logButton

मैं नए स्विफ्ट 2 चयनकर्ता का उपयोग करने की सलाह दूंगा: #selector (classname.functionname)
खाली

5

यहाँ स्विफ्ट में समाधान है (आवश्यकतानुसार सेट विकल्प):

var optionButton = UIBarButtonItem()
optionButton.title = "Settings"
//optionButton.action = something (put your action here)
self.navigationItem.rightBarButtonItem = optionButton

4

आप उपवर्ग क्यों हैं UINavigationController? यदि आपको इसकी आवश्यकता है तो इसे उप-करने की कोई आवश्यकता नहीं है।

UINavigationControllerशीर्ष पर एक पदानुक्रम सेट करें , और फिर अपने मूल दृश्य नियंत्रक की viewDidLoad:विधि में: बटन सेट करें और इसे नेविगेशन आइटम पर कॉल करके संलग्न करें

[[self navigationItem] setRightBarButtonItem:myBarButtonItem];

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


3

स्विफ्ट 4:

override func viewDidLoad() {
    super.viewDidLoad()

    navigationItem.leftBarButtonItem = UIBarButtonItem(title: "tap me", style: .plain, target: self, action: #selector(onButtonTap))
}

@objc func onButtonTap() {
    print("you tapped me !?")
}

यदि आप राइट साइड बटन चाहते हैं तो बस नेविगेशन
Item.rightBarButtonItem का

2
UIView *view = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 110, 50)];
view.backgroundColor = [UIColor clearColor];

UIButton *settingsButton =  [UIButton buttonWithType:UIButtonTypeCustom];
[settingsButton setImage:[UIImage imageNamed:@"settings_icon_png.png"] forState:UIControlStateNormal];
[settingsButton addTarget:self action:@selector(logOutClicked) forControlEvents:UIControlEventTouchUpInside];
[settingsButton setFrame:CGRectMake(40,5,32,32)];
[view addSubview:settingsButton];

UIButton *filterButton =  [UIButton buttonWithType:UIButtonTypeCustom];
[filterButton setImage:[UIImage imageNamed:@"filter.png"] forState:UIControlStateNormal];
[filterButton addTarget:self action:@selector(openActionSheet) forControlEvents:UIControlEventTouchUpInside];
[filterButton setFrame:CGRectMake(80,5,32,32)];
[view addSubview:filterButton];



self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:view];

2

यह कोशिश करो। यह मेरे लिए काम करते हैं।

नेविगेशन बार और दाएं बटन में बैकग्राउंड इमेज भी जोड़ी गई है।

 UIBarButtonItem *Savebtn=[[UIBarButtonItem alloc]initWithImage:[[UIImage    
 imageNamed:@"bt_save.png"]imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal] 
 style:UIBarButtonItemStylePlain target:self action:@selector(SaveButtonClicked)];
 self.navigationItem.rightBarButtonItem=Savebtn;


0
- (void)viewWillAppear:(BOOL)animated
{    
    [self setDetailViewNavigationBar];    
}
-(void)setDetailViewNavigationBar
{
    self.navigationController.navigationBar.tintColor = [UIColor purpleColor];
    [self setNavigationBarRightButton];
    [self setNavigationBarBackButton];    
}
-(void)setNavigationBarBackButton// using custom button 
{
   UIBarButtonItem *leftButton = [[UIBarButtonItem alloc] initWithTitle:@"  Back " style:UIBarButtonItemStylePlain target:self action:@selector(onClickLeftButton:)];          
   self.navigationItem.leftBarButtonItem = leftButton;    
}
- (void)onClickLeftButton:(id)sender 
{
   NSLog(@"onClickLeftButton");        
}
-(void)setNavigationBarRightButton
{

  UIBarButtonItem *anotherButton = [[UIBarButtonItem alloc] initWithTitle:@"Show" style:UIBarButtonItemStylePlain target:self action:@selector(onClickrighttButton:)];          
self.navigationItem.rightBarButtonItem = anotherButton;   

}
- (void)onClickrighttButton:(id)sender 
{
   NSLog(@"onClickrighttButton");  
}

0
    self.navigationItem.rightBarButtonItem =[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh target:self action:@selector(refreshData)];



}

-(void)refreshData{
    progressHud= [MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES];
    [progressHud setLabelText:@"拼命加载中..."];
    [self loadNetwork];
}

0

आपको अपने बारबटनइनेम को - (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animatedविधि में जोड़ना चाहिए ।


0

बस इस ऑब्जेक्टिव-सी कोड को कॉपी और पेस्ट करें।

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    [self addRightBarButtonItem];
}
- (void) addRightBarButtonItem {
    UIButton *btnAddContact = [UIButton buttonWithType:UIButtonTypeContactAdd];
    [btnAddContact addTarget:self action:@selector(addCustomerPressed:) forControlEvents:UIControlEventTouchUpInside];
    UIBarButtonItem *barButton = [[UIBarButtonItem alloc] initWithCustomView:btnAddContact];
    self.navigationItem.rightBarButtonItem = barButton;
}

#pragma mark - UIButton
- (IBAction)addCustomerPressed:(id)sender {
// Your right button pressed event
}

मैं मदद करने की कोशिश कर रहा हूं
विवेक

0

यह समस्या तब हो सकती है जब हम व्यू कंट्रोलर को हटाते हैं या इंटरफ़ेस बिल्डर (main.storyboard) के अंदर नए व्यू कंट्रोलर को जोड़ने की कोशिश करते हैं। इस समस्या को ठीक करने के लिए, नए दृश्य नियंत्रक के अंदर "नेविगेशन आइटम" जोड़ना होगा। कभी-कभी ऐसा होता है कि हम नया व्यू कंट्रोलर स्क्रीन बनाते हैं और यह स्वचालित रूप से "नेविगेशन आइटम" से कनेक्ट नहीं होता है।

  1. Main.storyboard पर जाएं।
  2. उस नए दृश्य नियंत्रक का चयन करें।
  3. दस्तावेज़ की रूपरेखा पर जाएं।
  4. नियंत्रक सामग्री देखें।
  5. यदि नए व्यू कंट्रोलर में नेविगेशन आइटम नहीं है, तो पिछले व्यू कंट्रोलर से नेविगेशन आइटम को कॉपी करके नए व्यू कंट्रोलर में पेस्ट करें।
  6. प्रोजेक्ट को सहेजें और साफ़ करें।

0

इसके अलावा, आप कई बटन का उपयोग करने में सक्षम हैं rightBarButtonItems

-(void)viewDidLoad{

    UIBarButtonItem *button1 = [[UIBarButtonItem alloc] initWithTitle:@"button 1" style:UIBarButtonItemStylePlain target:self action:@selector(YOUR_METHOD1:)];
    UIBarButtonItem *button2 = [[UIBarButtonItem alloc] initWithTitle:@"button 2" style:UIBarButtonItemStylePlain target:self action:@selector(YOUR_METHOD2:)];

    self.navigationItem.rightBarButtonItems = @[button1, button2];
}

-1

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

उदाहरण के लिए:

@interface बेसकंट्रोलर: UIViewController {

} - (शून्य) setBackButtonCaption: (NSString *) कैप्शन;

(शून्य) setRightButtonCaption: (NSString *) कैप्शन सेलेक्ट: (SEL) चयनकर्ता;

Baseend.M में //end //

(शून्य) setBackButtonCaption: (NSString *) कैप्शन {

UIBarButtonItem *backButton =[[UIBarButtonItem alloc] init];

backButton.title= caption;
self.navigationItem.backBarButtonItem = backButton;
[backButton release];

} - (शून्य) setRightButtonCaption: (NSString *) कैप्शन सेलेक्ट: (SEL) चयनकर्ता {

  UIBarButtonItem *rightButton = [[UIBarButtonItem alloc] init];
rightButton.title = caption;

rightButton.target= self;

[rightButton setAction:selector];

self.navigationItem.rightBarButtonItem= rightButton;

[rightButton release];

}

और अब किसी भी कस्टम दृश्य में, इस आधार दृश्य को लागू करने के तरीकों को कॉल करें:

@interface लॉगिन दृश्य: बेसकंट्रोलर {

कुछ विधि में आधार विधि को कॉल करें:

SEL sel = @selector (switchToForgotPIN);

[सुपर सेटरूटटन कैप्शन: @ "पिन भूल गए" चयन: सेल];

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