Jak dodać prawy przycisk do kontrolera UINavigationController?

Próbuję dodać przycisk odświeżania do górnego paska kontrolera nawigacyjnego bez powodzenia.

Oto nagłówek:

@interface PropertyViewController : UINavigationController {

}

Oto jak próbuję to dodać:

- (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;
}
Author: lambmj, 2009-08-03

21 answers

Spróbuj to zrobić w viewDidLoad. Generalnie powinieneś odłożyć wszystko, co możesz do tego momentu, gdy UIViewController jest w użyciu, to i tak może upłynąć sporo czasu, zanim się wyświetli, nie ma sensu wcześnie wykonywać pracy i wiązać pamięć.

- (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];
}

Co do tego, dlaczego obecnie nie działa, nie mogę powiedzieć ze 100% pewnością, nie widząc więcej kodu, ale wiele rzeczy dzieje się między init a ładowaniem widoku, i może robisz coś, co powoduje reset nawigacji w pomiędzy.

 358
Author: Louis Gerbarg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-23 19:58:45

Spróbuj dodać Przycisk do navigationItem kontrolera widoku, który zostanie wciśnięty na tę klasę PropertyViewController, którą utworzyłeś.

Czyli:

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];

Teraz ten infoButton, który został utworzony programowo, pojawi się na pasku nawigacyjnym. Chodzi o to, że Kontroler nawigacyjny pobiera informacje o wyświetlaczu (tytuł, przyciski itp.) z UIViewController, który ma być wyświetlany. Nie dodajesz przycisków itp. bezpośrednio do UINavigationController.

 36
Author: Adam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-09 05:49:20

Wydaje się, że niektórzy ludzie (jak ja) mogą tu przychodzić, szukając sposobu na dodanie przycisku paska nawigacyjnego w Kreatorze interfejsów. Odpowiedź poniżej pokazuje, jak to zrobić.

Dodaj Kontroler nawigacji do swojego storyboardu

Wybierz kontroler widoku, a następnie w menu Xcode wybierz Editor > Embed In > Navigation Controller.

Tutaj wpisz opis obrazka

Alternatywnie możesz dodać UINavigationBar z biblioteki obiektów.

Dodaj przycisk paska Pozycja

Przeciągnij UIBarButtonItem z biblioteki obiektów do górnego paska nawigacyjnego.

Tutaj wpisz opis obrazka

Powinno wyglądać tak:

Tutaj wpisz opis obrazka

Ustaw atrybuty

Możesz dwukrotnie kliknąć "element", aby zmienić tekst na coś w rodzaju" Refresh", ale istnieje rzeczywista ikona dla Refresh , której możesz użyć. Wystarczy wybrać Inspektora atrybutów dla UIBarButtonItem i dla elementu systemowego wybrać odśwież .

Tutaj wpisz opis obrazka

Wyświetli domyślną ikonę odświeżania.

Tutaj wpisz opis obrazka

Dodaj akcję IB

Przeciągnij z UIBarButtonItem do kontrolera widoku, aby dodać @IBAction.

class ViewController: UIViewController {

    @IBAction func refreshBarButtonItemTap(sender: UIBarButtonItem) {

        print("How refreshing!")
    }

}
To wszystko.
 23
Author: Suragch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-12 11:19:00

Istnieje domyślny przycisk systemowy "Refresh":

- (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
Author: Manni,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-27 14:31:32

Możesz użyć tego:

Objective-C

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

Swift

var rightSideOptionButton = UIBarButtonItem()
rightSideOptionButton.title = "Right"
self.navigationItem.rightBarButtonItem = rightSideOptionButton
 10
Author: Vandit Mehta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-12 11:00:44
-(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
Author: Gaurav Gilani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-19 07:12:30

Dla 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
Author: fandro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-03 07:42:33

Oto rozwiązanie w języku Swift (ustaw opcje w razie potrzeby):

var optionButton = UIBarButtonItem()
optionButton.title = "Settings"
//optionButton.action = something (put your action here)
self.navigationItem.rightBarButtonItem = optionButton
 5
Author: vontell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-20 19:41:54

Możesz spróbować

self.navigationBar.topItem.rightBarButtonItem = anotherButton;
 4
Author: user2999133,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-04 07:43:27

Dlaczego jesteście podklasami UINavigationController? Nie ma potrzeby podklasyfikować go, jeśli wszystko, co musisz zrobić, to dodać do niego przycisk.

Ustaw hierarchię z UINavigationController u góry, a następnie w metodzie kontrolera widoku głównego viewDidLoad:: Ustaw przycisk i dołącz go do elementu nawigacyjnego, wywołując

[[self navigationItem] setRightBarButtonItem:myBarButtonItem];
 3
Author: Jasarien,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-09 05:49:18
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
Author: Sandeep,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-12 07:04:53

Spróbuj this.It pracuj dla mnie.

pasek nawigacji , a także dodano obraz tła do prawego przycisku.

 UIBarButtonItem *Savebtn=[[UIBarButtonItem alloc]initWithImage:[[UIImage    
 imageNamed:@"bt_save.png"]imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal] 
 style:UIBarButtonItemStylePlain target:self action:@selector(SaveButtonClicked)];
 self.navigationItem.rightBarButtonItem=Savebtn;
 2
Author: Jaywant Khedkar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-23 07:11:02

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 !?")
}
 2
Author: ergunkocak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-11 11:53:00

Użyj tego kodu do nawigowania prawym przyciskiem z wygranym tytułem i wywołaj metodę po kliknięciu prawym przyciskiem.

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

-(void)sortedDataCalled {
    NSLog(@"callBtn");    
}
 1
Author: Naiyer Aghaz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-04 05:47:17
    UIBarButtonItem *rightBarButtonItem = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(add:)];
self.navigationItem.rightBarButtonItem = rightBarButtonItem;
 0
Author: Mahesh Aswathanarayana,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-03 11:13:44
- (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
Author: tv.ashvin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-25 05:11:02
    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
Author: Gank,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-15 06:57:57

Należy dodać swój barButtonItem w metodzie - (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated.

 0
Author: Retik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-20 10:01:56

Wystarczy skopiować i wkleić ten kod 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
Author: Vivek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-29 10:00:30

Ten problem może wystąpić, jeśli usuniemy kontroler widoku lub spróbujemy dodać nowy kontroler widoku wewnątrz konstruktora interfejsu (main.storyboard). Aby rozwiązać ten problem, należy dodać "element nawigacyjny" wewnątrz nowego kontrolera widoku. Czasami zdarza się, że tworzymy nowy ekran kontrolera widoku i nie łączy się on automatycznie z "elementem nawigacyjnym".

    / Align = "left" / storyboard.
  1. wybierz nowy kontroler widoku.
  2. Przejdź do zarysu dokumentu.
  3. Sprawdź widok Zawartość kontrolera.
  4. Jeśli nowy kontroler widoku nie ma elementu nawigacyjnego, skopiuj element nawigacyjny z poprzedniego kontrolera widoku i wklej go do nowego kontrolera widoku.
  5. Zapisz i wyczyść projekt.
 0
Author: NilamK,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-12 01:05:41

@Artilheiro: jeśli jest to projekt oparty na nawigacji, możesz utworzyć BaseViewController. Wszystkie inne widoki odziedziczą ten widok podstawowy. W BaseView można zdefiniować ogólne metody dodawania prawego przycisku lub zmiany tekstu lewego przycisku.

Ex:

@ interface BaseController : UIViewController {

} - (void) setBackButtonCaption: (NSString *)caption;

(void) setRightButtonCaption: (NSString *) caption selectot: (Sel) selector;

@end // In 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];

}

I teraz w dowolnym widoku niestandardowym zaimplementuj ten widok bazowy wywołując metody:

@ interface LoginView: BaseController {

W jakiejś metodzie wywołaj metodę bazową jako:

SEL sel= @selector (switchToForgotPIN);

[super setRightButtonCaption:@" Forgot PIN " selectot:sel];

 -1
Author: iPhoneDev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-13 05:18:22