web-dev-qa-db-ja.com

タイトルを変更するUIBarButtonItemが機能しない

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

「編集」ボタンの色は変わります(スタイルを設定する行は機能しています)が、ボタンのタイトルを設定する行は機能していません。

24
CodeGuy

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]に設定されていることを確認してください。

35
Seamus

この問題が発生したため、初期化時にUIBarButtonItemスタイルをカスタムタイプに設定することで解決しました。次に、タイトルの値を変更すると、タイトルが設定されます。

また、viewDidLoadメソッドでpotentialTitle値を設定して、可能なすべてのタイトルに対してボタンのサイズが正しく設定されるようにすることもできます。

24
Mark Bridges

私の場合、タイトルが表示されなかったのは、xibでバーボタンアイテムの 'identifier'プロパティを 'Cancel'として選択したためです。

enter image description here

ボタンをナビゲーションバーに割り当てる前でも、titleプロパティを設定しようとしましたが、タイトルが更新されていませんでした。

私はこのようにしました:

enter image description here そして、思い通りに動き始めました。

8
Joe M

title プロパティのドキュメントを見ると、ナビゲーションバーに割り当てる前に設定する必要があることが明示されています。現在行っていることを行う代わりに、2つのバーボタン項目(1つは完了用、もう1つは編集用)を使用して、それらを交互に設定できます。

8

「編集」と「完了」を切り替える場合は、self.navigationItem.rightBarButtonItem = self.editButtonItem;を使用してください。

この移行を処理します

2
gyan

ユーザーがボタンを押すたびにボタンを切り替えるだけです。

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

Swift 3.0、3.2、または4.0

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"
    }
}
0
umarqattan