【问题标题】:Add a done button in a UINavigationbar在 UINavigationbar 中添加完成按钮
【发布时间】:2026-01-12 20:00:02
【问题描述】:

当用户触摸特定的文本字段或文本视图时,如何将完成按钮添加到 UINavigationbar?

或者更好的方法是检测键盘何时显示,然后显示按钮。

我希望完成按钮可以像在标准 Notes 应用程序中一样关闭键盘。

【问题讨论】:

    标签: iphone uikeyboard


    【解决方案1】:

    您可以尝试类似的方法:

    - (void)textFieldDidBeginEditing:(UITextField *)textField 
    {       
        UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone
                                                                                    target:self
                                                                                    action:@selector(doneEditing)];
        [[self navigationItem] setRightBarButtonItem:doneButton];
        [doneButton release];
    }
    

    还有

    - (void)textViewDidBeginEditing:(UITextView *)textView 
    {       
        UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone
                                                                                    target:self
                                                                                    action:@selector(doneEditing)];
        [[self navigationItem] setRightBarButtonItem:doneButton];
        [doneButton release];
    }
    

    随心所欲地定制以下内容

    - (void)doneEditing {
        [[self view] endEditing:YES];
    }
    

    然后删除- (void)textFieldDidEndEditing:(UITextField *)textField- (void)textViewDidEndEditing:(UITextView *)textView 中的按钮

    记得设置代理!

    【讨论】:

    【解决方案2】:

    您应该采用委托协议,因为我相信您在这方面具有优势。你可以这样做——

    - (void)textViewDidBeginEditing:(UITextView *)textView {
        UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone
                                                                                    target:textView
                                                                                    action:@selector(resignFirstResponder)];
        self.navigationItem.rightBarButtonItem = doneButton;
        [doneButton release];
    }
    

    但是,如果您要观察通知,则无法知道哪个是第一响应者。当然,如果您只需要担心一个对象,这不是什么大问题。

    【讨论】: