192

ナビゲーション コントローラーのトップ バーに更新ボタンを追加しようとしていますが、成功しません。

ヘッダーは次のとおりです。

@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;
}
4

21 に答える 21

363

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 とビューの読み込みの間で多くのことが発生しており、navigationItem がリセットされる原因となる何かを実行している可能性があります。の間に。

于 2009-08-02T20:43:56.920 に答える
38

PropertyViewController作成したこのクラスにプッシュされるView ControllerのnavigationItemにボタンを追加してみてください。

あれは:

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

これで、プログラムで作成されたこの infoButton がナビゲーション バーに表示されます。アイデアは、ナビゲーション コントローラーが、表示UIViewControllerしようとしている から表示情報 (タイトル、ボタンなど) を取得するというものです。実際には、ボタンなどを に直接追加するわけではありませんUINavigationController

于 2009-12-11T22:11:19.517 に答える
25

Interface Builder にナビゲーション バー ボタンを追加する方法を探して、(私のような) ここに来る人もいるようです。以下の回答は、その方法を示しています。

ストーリーボードにナビゲーション コントローラーを追加する

View Controller を選択し、Xcode メニューでEditor > Embed In > Navigation Controllerを選択します。

ここに画像の説明を入力

UINavigationBarまたは、オブジェクト ライブラリからを追加することもできます。

バー ボタン アイテムを追加する

UIBarButtonItemをオブジェクト ライブラリから上部のナビゲーション バーにドラッグします。

ここに画像の説明を入力

次のようになります。

ここに画像の説明を入力

属性を設定する

「アイテム」をダブルクリックしてテキストを「更新」などに変更することもできますが、使用できる更新用の実際のアイコンがあります。の属性インスペクターを選択し、UIBarButtonItemシステムアイテムの [更新]を選択します。

ここに画像の説明を入力

これにより、デフォルトの更新アイコンが表示されます。

ここに画像の説明を入力

IB アクションを追加する

から View Controller へのドラッグをUIBarButtonItem制御して、 を追加し@IBActionます。

class ViewController: UIViewController {

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

それでおしまい。

于 2015-11-12T11:19:00.147 に答える
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 {

}
于 2012-09-27T14:31:32.383 に答える
11

これを使用できます:

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
于 2013-07-24T13:01:41.790 に答える
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];

}
于 2014-05-19T07:12:30.720 に答える
6

あなたが試すことができます

self.navigationBar.topItem.rightBarButtonItem = anotherButton;
于 2016-12-10T07:28:25.467 に答える
5

これがSwiftのソリューションです(必要に応じてオプションを設定してください):

var optionButton = UIBarButtonItem()
optionButton.title = "Settings"
//optionButton.action = something (put your action here)
self.navigationItem.rightBarButtonItem = optionButton
于 2015-06-20T19:41:54.147 に答える
4

なぜあなたはサブクラスUINavigationControllerですか?ボタンを追加するだけであれば、サブクラス化する必要はありません。

を最上位にして階層を設定し、UINavigationController次にルート ビュー コントローラーのviewDidLoad:メソッドで: ボタンを設定し、呼び出してナビゲーション アイテムにアタッチします。

[[self navigationItem] setRightBarButtonItem:myBarButtonItem];
于 2009-08-02T23:38:50.773 に答える
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];
于 2012-09-12T07:04:53.970 に答える
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];
}
于 2014-12-15T06:57:57.007 に答える
0

Also you are able to add multiple buttons using 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];
}
于 2018-10-10T11:11:00.900 に答える
-1

@Artilheiro : ナビゲーション ベースのプロジェクトの場合、BaseViewController を作成できます。他のすべてのビューは、この BaseView を継承します。BaseView では、汎用メソッドを定義して、右ボタンを追加したり、左ボタンのテキストを変更したりできます。

元:

@interface BaseController : UIViewController {

} - (void) setBackButtonCaption:(NSString *)キャプション;

(void) setRightButtonCaption:(NSString *)キャプション selectot:(SEL )selector;

@end // BaseView.M 内

(void) setBackButtonCaption:(NSString *)キャプション {

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

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

} - (void) setRightButtonCaption:(NSString *)キャプション selectot:(SEL )selector {

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

rightButton.target= self;

[rightButton setAction:selector];

self.navigationItem.rightBarButtonItem= rightButton;

[rightButton release];

}

そして、任意のカスタム ビューで、この基本ビューを実装してメソッドを呼び出します。

@interface LoginView : BaseController {

一部のメソッドでは、次のように基本メソッドを呼び出します。

SEL sel= @selector(switchToForgotPIN);

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

于 2010-05-13T05:18:22.477 に答える