Como adicionar um botão direito a um UINavigationController?
-
10-07-2019 - |
Pergunta
Eu estou tentando adicionar um botão de atualização para a barra de topo de um controlador de navegação sem sucesso.
Aqui está o cabeçalho:
@interface PropertyViewController : UINavigationController {
}
Aqui está como eu estou tentando adicioná-lo:
- (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;
}
Solução
Tente fazê-lo em viewDidLoad. Geralmente você deve adiar qualquer coisa que você pode até esse ponto de qualquer maneira, quando um UIViewController é inited ainda pode ser um bom tempo antes de exibir, nenhum ponto em fazer o trabalho cedo e amarrar memória.
- (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];
}
Quanto ao porquê de ele não está funcionando atualmente, eu não posso dizer com 100% de certeza sem ver mais código, mas um monte de coisas acontece entre o init ea vista de carregamento, e você pode estar fazendo algo que faz com que o navigationItem para repor no meio.
Outras dicas
Tente adicionar o botão à navigationItem do controlador de vista que vai ser empurrado para esta classe PropertyViewController
que você criou.
Isto é:
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];
Agora, este infoButton que foi criado através de programação vai aparecer na barra de navegação. A ideia é que o controlador de navegação pega sua informação do mostrador (título, botões, etc) a partir do UIViewController
que ele está prestes a exibição. Você realmente não adicionar botões e tal diretamente ao UINavigationController
.
Parece que algumas pessoas (como eu) pode vir aqui à procura de como adicionar um botão da barra de navegação no Interface Builder. A resposta abaixo mostra como fazê-lo.
Adicionar um controlador de navegação para o seu Storyboard
Selecione o seu View Controller e, em seguida, no menu Xcode escolha Editor> Embed Em> controlador de navegação .
Como alternativa, você pode adicionar um UINavigationBar
do Object Library.
Adicionar um botão Bar item
Arraste um UIBarButtonItem
da biblioteca de objetos para a barra de navegação superior.
Deve ficar assim:
definir os atributos
Você pode clicar duas vezes em "Item" para alterar o texto para algo como "Atualizar", mas há um ícone real para Atualizar que você pode usar. Basta selecionar os atributos Inspector para o UIBarButtonItem
e para Sistema item escolha Atualizar .
Isso lhe dará o ícone de atualização padrão.
Adicionar um IB Action
Controle de arraste do UIBarButtonItem
ao controlador de exibição para adicionar um @IBAction
.
class ViewController: UIViewController {
@IBAction func refreshBarButtonItemTap(sender: UIBarButtonItem) {
print("How refreshing!")
}
}
É isso.
Existe um botão padrão do sistema para "Atualizar":
- (void)viewDidLoad {
[super viewDidLoad];
UIBarButtonItem *refreshButton = [[[UIBarButtonItem alloc]
initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh
target:self action:@selector(refreshClicked:)] autorelease];
self.navigationItem.rightBarButtonItem = refreshButton;
}
- (IBAction)refreshClicked:(id)sender {
}
Você pode usar este:
Objective-C
UIBarButtonItem *rightSideOptionButton = [[UIBarButtonItem alloc] initWithTitle:@"Right" style:UIBarButtonItemStylePlain target:self action:@selector(rightSideOptionButtonClicked:)];
self.navigationItem.rightBarButtonItem = rightSideOptionButton;
Swift
let rightSideOptionButton = UIBarButtonItem()
rightSideOptionButton.title = "Right"
self.navigationItem.rightBarButtonItem = rightSideOptionButton
-(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];
}
para 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
Aqui está a solução em Swift (opções de conjunto, conforme necessário):
var optionButton = UIBarButtonItem()
optionButton.title = "Settings"
//optionButton.action = something (put your action here)
self.navigationItem.rightBarButtonItem = optionButton
Por que você está subclasses UINavigationController
? Não há necessidade de subclasse-lo se tudo que você precisa fazer é adicionar um botão para ele.
Configurar uma hierarquia com um UINavigationController
no topo, em seguida, no método viewDidLoad:
sua visão do controlador de raiz: configurar o botão e anexá-lo ao item de navegação chamando
[[self navigationItem] setRightBarButtonItem:myBarButtonItem];
Você pode tentar
self.navigationBar.topItem.rightBarButtonItem = anotherButton;
Swift 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 !?")
}
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];
Tente this.It trabalho para mim.
barra de navegação e imagem de fundo também adicionado ao botão direito.
UIBarButtonItem *Savebtn=[[UIBarButtonItem alloc]initWithImage:[[UIImage
imageNamed:@"bt_save.png"]imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]
style:UIBarButtonItemStylePlain target:self action:@selector(SaveButtonClicked)];
self.navigationItem.rightBarButtonItem=Savebtn;
Use este código para a direita da barra de navegação botão com o título conquistado e chamar um método depois clique no botão direito.
UIBarButtonItem *btnSort=[[UIBarButtonItem alloc]initWithTitle:@"right" style:UIBarButtonItemStylePlain target:self action:@selector(sortedDataCalled)];
self.navigationItem.rightBarButtonItem=btnSort;
}
-(void)sortedDataCalled {
NSLog(@"callBtn");
}
UIBarButtonItem *rightBarButtonItem = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(add:)];
self.navigationItem.rightBarButtonItem = rightBarButtonItem;
- (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");
}
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];
}
Você deve adicionar seu barButtonItem no método - (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
.
Apenas e cole este código 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
}
Este problema pode ocorrer se eliminar o controlador de vista ou tentar adicionar novo controlador de vista dentro do construtor de interface (main.storyboard). Para corrigir esse problema, é necessário adicionar "Navegação item" dentro novo controlador de vista. Às vezes acontece que nós criamos tela novo controlador de vista e não se conecta a "Navegação item" automaticamente.
- Vá para o main.storyboard.
- Selecione essa nova visão Controller.
- Vá para o esboço do documento.
- Verifique visualiza o conteúdo do controlador.
- Se o novo controlador de vista não tem um item de navegação, em seguida, copiar item de navegação anteriores View Controller e colá-lo para o novo controlador de vista.
- salvar e limpar o projeto.
Além disso, você é capaz de adicionar vários botões usando 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];
}
@Artilheiro: Se seu um projeto navigationbased, u pode criar BaseViewController. Todos os outros vista herdarão este Baseview. Em Baseview u pode definir métodos genéricos para adicionar botão direito ou para alterar o texto do botão esquerdo.
ex:
@ interface BaseController: UIViewController {
} - (void) setBackButtonCaption: (NSString *) caption;
(void) setRightButtonCaption: (NSString *) caption selectot: (SEL) selector;
@end // Em BaseView.M
(void) setBackButtonCaption: (NSString *) caption {
UIBarButtonItem *backButton =[[UIBarButtonItem alloc] init];
backButton.title= caption;
self.navigationItem.backBarButtonItem = backButton;
[backButton release];
} - (void) setRightButtonCaption: (NSString *) caption selectot: (SEL) selector {
UIBarButtonItem *rightButton = [[UIBarButtonItem alloc] init];
rightButton.title = caption;
rightButton.target= self;
[rightButton setAction:selector];
self.navigationItem.rightBarButtonItem= rightButton;
[rightButton release];
}
E agora, em qualquer modo de exibição personalizado, implementar esta visão de base chamar os métodos:
@ interface LoginView: BaseController {
Em alguns método base chamada de método como:
= SEL sel @selector (switchToForgotPIN);
[Super setRightButtonCaption: @ "Esqueceu o PIN" selectot: sel];