it-swarm.com.ru

Как добавить правую кнопку в UINavigationController?

Я пытаюсь добавить кнопку обновления в верхнюю панель контроллера навигации, но безуспешно.

Вот заголовок:

@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;
}
186
Artilheiro

Попробуйте сделать это в viewDidLoad. Как правило, в любом случае вам следует отложить все, что вы можете, до этого момента, когда 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 и загрузкой представления, и вы можете делать что-то, что приводит к сбросу навигационного элемента в между.

360
Louis Gerbarg

Попробуйте добавить кнопку в навигационный элемент контроллера представления, который будет помещен в созданный вами класс 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.

37
Adam

Кажется, что некоторые люди (как я) могут прийти сюда в поисках того, как добавить кнопку панели навигации в Интерфейсном Разработчике. Ответ ниже показывает, как это сделать.

Добавьте навигационный контроллер к вашему раскадровке

Выберите ваш View Controller, а затем в меню Xcode выберите Editor> Embed In> Navigation Controller.

 enter image description here

Кроме того, вы можете добавить UINavigationBar из библиотеки объектов.

Добавить элемент панели кнопок

Перетащите UIBarButtonItem из библиотеки объектов на верхнюю панель навигации.

 enter image description here

Это должно выглядеть так:

 enter image description here

Установить атрибуты

Вы можете дважды щелкнуть «Элемент», чтобы изменить текст на что-то вроде «Обновить», но есть реальный значок для Обновить, который вы можете использовать. Просто выберите Инспектор атрибутов для UIBarButtonItem и для System Item выберите Refresh.

 enter image description here

Это даст вам значок обновления по умолчанию.

 enter image description here

Добавить действие IB

Управляйте перетаскиванием из UIBarButtonItem в View Controller, чтобы добавить @IBAction.

class ViewController: UIViewController {

    @IBAction func refreshBarButtonItemTap(sender: UIBarButtonItem) {

        print("How refreshing!")
    }

}

Вот и все. 

24
Suragch

По умолчанию есть системная кнопка «Обновить»:

- (void)viewDidLoad {
    [super viewDidLoad];

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

}

- (IBAction)refreshClicked:(id)sender {

}
13
Manni

Вы можете использовать это:

Objective-C

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
10
Vandit Mehta

Для Swift 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
6
fandro
-(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];

}
6
Gaurav Gilani

Вот решение в Swift (установите параметры по мере необходимости):

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

Ты можешь попробовать 

self.navigationBar.topItem.rightBarButtonItem = anotherButton;
4
user2999133

Почему вы подклассы UINavigationController? Нет необходимости создавать его подкласс, если все, что вам нужно сделать, это добавить к нему кнопку.

Установите иерархию с UINavigationController вверху, а затем в методе viewDidLoad: вашего корневого контроллера: установите кнопку и присоедините ее к элементу навигации, вызвав

[[self navigationItem] setRightBarButtonItem:myBarButtonItem];
4
Jasarien

Свифт 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 !?")
}
3
ergunkocak
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
Sandeep

Попробуйте это. Это работает для меня.

Панель навигации , а также добавил фоновое изображение к правой кнопке. 

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

Используйте этот код для правой кнопки навигации с вашим выигранным названием и вызывайте метод после нажатия правой кнопки.

UIBarButtonItem *btnSort=[[UIBarButtonItem alloc]initWithTitle:@"right" style:UIBarButtonItemStylePlain target:self action:@selector(sortedDataCalled)];
   self.navigationItem.rightBarButtonItem=btnSort;
}

-(void)sortedDataCalled {
    NSLog(@"callBtn");    
}
1
Naiyer Aghaz
    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
Gank

Также вы можете добавить несколько кнопок, используя 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];
}
0
yoAlex5

Эта проблема может возникнуть, если мы удалим контроллер представления или попытаемся добавить новый контроллер представления внутри построителя интерфейса (main.storyboard). Чтобы решить эту проблему, необходимо добавить «Элемент навигации» внутри нового контроллера представления. Иногда случается, что мы создаем новый экран контроллера представления, и он не подключается к «Элементу навигации» автоматически. 

  1. Перейти на main.storyboard.
  2. Выберите этот новый вид контроллера. 
  3. Перейти к схеме документа.
  4. Проверьте просмотр содержимого контроллера.
  5. Если новый контроллер представления не имеет элемента навигации, скопируйте элемент навигации из предыдущего контроллера просмотра и вставьте его в новый контроллер представления.
  6. сохранить и очистить проект. 
0
NilamK
    UIBarButtonItem *rightBarButtonItem = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(add:)];
self.navigationItem.rightBarButtonItem = rightBarButtonItem;
0
Mahesh Aswathanarayana
- (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
tv.ashvin

Вы должны добавить свой barButtonItem в методе - (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated.

0
Retik

Просто скопируйте и вставьте этот код Objective-C.

- (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
Vivek