UIBarButtonItemのタイトルを変更するにはどうすればよいですか? UINavigationBarで「編集」ボタンが押されたときに呼び出される次のコードがあります。
-(void)editButtonSelected:(id)sender {
NSLog(@"edit button selected!");
if(editing) {
NSLog(@"notediting");
[super setEditing:NO animated:NO];
[tableView setEditing:NO animated:NO];
[tableView reloadData];
[rightButtonItem setTitle:@"Edit"];
[rightButtonItem setStyle:UIBarButtonItemStylePlain];
editing = false;
}
else {
NSLog(@"editing");
[super setEditing:YES animated:YES];
[tableView setEditing:YES animated:YES];
[tableView reloadData];
[rightButtonItem setTitle:@"Done"];
[rightButtonItem setStyle:UIBarButtonItemStyleDone];
editing = true;
}
}
「編集」ボタンの色は変わります(スタイルを設定する行は機能しています)が、ボタンのタイトルを設定する行は機能していません。
UIBarButtonItemのタイトルを動的に変更するために、次のことを行いました。この状況では、UIViewTableControllerを使用しておらず、標準のeditButtonを使用できません。 tableViewと他のサブビューを持つビューがあり、制限されたUIViewTableControllerの動作をエミュレートしたいと思っていました。
- (void)InitializeNavigationItem
{
NSMutableArray *array = [[NSMutableArray alloc] initWithCapacity:2];
UIBarButtonItem* barButton;
barButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd
target:self
action:@selector(addNewItem:)];
barButton.style = UIBarButtonItemStyleBordered;
[array addObject:barButton];
// --------------------------------------------------------------------------------------
barButton = [[UIBarButtonItem alloc] initWithTitle:@"Edit" style:UIBarButtonItemStyleBordered
target:self
action:@selector(editMode:)];
barButton.style = UIBarButtonItemStyleBordered;
barButton.possibleTitles = [NSSet setWithObjects:@"Edit", @"Done", nil];
[array addObject:barButton];
self.navigationItem.rightBarButtonItems = array;
}
- (IBAction)editMode:(UIBarButtonItem *)sender
{
if (self.orderTable.editing)
{
sender.title = @"Edit";
[self.orderTable setEditing:NO animated:YES];
}
else
{
sender.title = @"Done";
[self.orderTable setEditing:YES animated:YES];
}
}
IBarButtonSystemItemEdit barButtonを使用しなかったことに注意してください、そのボタンの名前を手動で変更することはできません。
タイトルを変更したときにボタンのサイズが変更されないように、possibleTitlesプロパティを利用することもできます。
Storyboard/XIBを使用してこれらのボタンを作成または設定する場合は、タイトルを制御するボタンの[Bar Button Item Identifier]が[Custom]に設定されていることを確認してください。
この問題が発生したため、初期化時にUIBarButtonItemスタイルをカスタムタイプに設定することで解決しました。次に、タイトルの値を変更すると、タイトルが設定されます。
また、viewDidLoadメソッドでpotentialTitle値を設定して、可能なすべてのタイトルに対してボタンのサイズが正しく設定されるようにすることもできます。
私の場合、タイトルが表示されなかったのは、xibでバーボタンアイテムの 'identifier'プロパティを 'Cancel'として選択したためです。
ボタンをナビゲーションバーに割り当てる前でも、titleプロパティを設定しようとしましたが、タイトルが更新されていませんでした。
私はこのようにしました:
そして、思い通りに動き始めました。
title
プロパティのドキュメントを見ると、ナビゲーションバーに割り当てる前に設定する必要があることが明示されています。現在行っていることを行う代わりに、2つのバーボタン項目(1つは完了用、もう1つは編集用)を使用して、それらを交互に設定できます。
「編集」と「完了」を切り替える場合は、self.navigationItem.rightBarButtonItem = self.editButtonItem;
を使用してください。
この移行を処理します
ユーザーがボタンを押すたびにボタンを切り替えるだけです。
- (void)setNavigationButtonAsEdit
{
UIBarButtonItem* editButton = [[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"Edit", @"")
style:UIBarButtonItemStylePlain
target:self
action:@selector(editButtonPressed:)];
self.navigationItem.rightBarButtonItems = [NSArray arrayWithObject:editButton];
}
- (void)setNavigationButtonAsDone
{
UIBarButtonItem* doneButton = [[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"Done", @"")
style:UIBarButtonItemStylePlain
target:self
action:@selector(editButtonPressed:)];
self.navigationItem.rightBarButtonItems = [NSArray arrayWithObject:doneButton];
}
次に、ボタンの押下を処理するIBActionを作成します。
- (IBAction)editButtonPressed:(id)sender
{
NSString* buttonText = [sender title];
if ([buttonText isEqualToString:NSLocalizedString(@"Edit",@"")])
{
[self setNavigationButtonAsDone];
}
else
{
[self setNavigationButtonAsEdit];
}
}
TableViewオブジェクトを含むカスタムViewControllerがUITableViewController DelegateおよびDatasourceプロトコルに従う場合、次のコードを使用して、システムeditBarButtonItemをnavigationItem.leftBarButtonItem
(s)またはnavigationItem.rightBarButtonItem
(s)に追加できます。
func setupTableView() {
tableView.delegate = self
tableView.dataSource = self
navigationItem.rightBarButtonItem = editButtonItem
editButtonItem.action = #selector(CustomViewController.editTableView(_:))
}
@objc func editTableView(_ sender: UIBarButtonItem) {
tableView.isEditing = !tableView.isEditing
if tableView.isEditing {
sender.title = "Done"
} else {
sender.title = "Edit"
}
}