UINavigationControllerに右ボタンを追加する方法は?
-
10-07-2019 - |
質問
Navigation Controllerのトップバーに更新ボタンを追加しようとしていますが、成功しません。
ヘッダーは次のとおりです:
@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;
}
解決
viewDidLoadで試してください。一般的に、UIViewControllerが初期化された時点で、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とビューの読み込みの間で多くのことが起こります。間にリセットします。
他のヒント
作成したこの 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は、ナビゲーションバーに表示されます。これは、Navigation Controllerが表示しようとしている UIViewController
から表示情報(タイトル、ボタンなど)を取得するという考え方です。実際にボタンなどを UINavigationController
に直接追加することはありません。
Interface Builderでナビゲーションバーボタンを追加する方法を探している人(私のような人)がここに来るようです。以下の答えは、その方法を示しています。
Navigation Controllerをストーリーボードに追加
View Controllerを選択し、Xcodeメニューで Editor>を選択します。埋め込み> Navigation Controller 。
別の方法として、オブジェクトライブラリから UINavigationBar
を追加することもできます。
バーボタンアイテムを追加
UIBarButtonItem
をオブジェクトライブラリからトップナビゲーションバーにドラッグします。
次のようになります。
属性を設定
" Item"をダブルクリックできます。テキストを" Refresh"のようなものに変更しますが、実際に使用できる Refresh のアイコンがあります。 UIBarButtonItem
の属性インスペクターを選択し、システム項目の場合は、更新を選択します。
デフォルトの更新アイコンが表示されます。
IBアクションを追加
UIBarButtonItem
からView Controllerへのドラッグを制御して、 @IBAction
を追加します。
class ViewController: UIViewController {
@IBAction func refreshBarButtonItemTap(sender: UIBarButtonItem) {
print("How refreshing!")
}
}
それだけです。
" 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 {
}
これを使用できます:
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];
}
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
Swiftのソリューションは次のとおりです(必要に応じてオプションを設定します):
var optionButton = UIBarButtonItem()
optionButton.title = "Settings"
//optionButton.action = something (put your action here)
self.navigationItem.rightBarButtonItem = optionButton
なぜ UINavigationController
をサブクラス化するのですか?ボタンを追加するだけであれば、サブクラス化する必要はありません。
上部に UINavigationController
を使用して階層を設定し、ルートビューコントローラーの viewDidLoad:
メソッドで:ボタンを設定してナビゲーションアイテムに添付します呼び出すことにより
[[self navigationItem] setRightBarButtonItem:myBarButtonItem];
試すことができます
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];
これを試してください。それは私のために働きます。
ナビゲーションバー、および右ボタンに背景画像も追加しました。
UIBarButtonItem *Savebtn=[[UIBarButtonItem alloc]initWithImage:[[UIImage
imageNamed:@"bt_save.png"]imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]
style:UIBarButtonItemStylePlain target:self action:@selector(SaveButtonClicked)];
self.navigationItem.rightBarButtonItem=Savebtn;
獲得したタイトルで右ボタンナビゲーションバーにこのコードを使用し、右ボタンをクリックした後にメソッドを呼び出します。
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];
}
-(void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
メソッドにbarButtonItemを追加する必要があります。
この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
}
この問題は、View Controllerを削除するか、インターフェイスbuilder(main.storyboard)内に新しいView Controllerを追加しようとすると発生する可能性があります。この問題を修正するには、「ナビゲーションアイテム」を追加する必要があります。新しいView Controller内。新しいView Controller画面を作成し、「Navigation Item」に接続しない場合があります。自動的に。
- main.storyboardに移動します。
- その新しいView Controllerを選択します。
- ドキュメントの概要に移動します。
- View Controllerのコンテンツを確認します。
- 新しいView ControllerにNavigation項目がない場合は、前のView ControllerからNavigation項目をコピーして、新しいView Controllerに貼り付けます。
- プロジェクトを保存してクリーンアップします。
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:ナビゲーションベースのプロジェクトの場合、BaseViewControllerを作成できます。他のすべてのビューは、このBaseViewを継承します。 BaseViewでは、右ボタンを追加したり、左ボタンのテキストを変更したりするための汎用メソッドを定義できます。
ex:
@interface BaseController:UIViewController {
} -(void)setBackButtonCaption:(NSString *)caption;
(void)setRightButtonCaption:(NSString *)caption selectot:(SEL)selector;
@end // 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];
}
カスタムビューで、このベースビューを実装してメソッドを呼び出します:
@interface LoginView:BaseController {
一部のメソッドでは、ベースメソッドを次のように呼び出します。
SEL sel = @selector(switchToForgotPIN);
[super setRightButtonCaption:@" PINを忘れた場合" selectot:sel];