【问题标题】:Add a button to hide keyboard添加一个按钮来隐藏键盘
【发布时间】:2011-09-04 23:47:11
【问题描述】:

在一个UITextView上隐藏键盘,有方法:

...
    textfield.returnKeyType = UIReturnKeyDone;
    textfield.delegate = self;
....

-(BOOL)textFieldShouldReturn:(UITextField *)textField {
    [textField resignFirstResponder];
    return YES;

}

但是如果我想将“完成”按钮留给“返回”并添加一个隐藏键盘的按钮,我该怎么办?

【问题讨论】:

    标签: ios cocoa-touch keyboard uitextview


    【解决方案1】:

    您可以指定一个带有按钮的工具栏,该按钮将关闭键盘作为文本字段的inputAccessoryView。一个简单的例子是,

    UIBarButtonItem *barButton = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:textField action:@selector(resignFirstResponder)] autorelease];
    UIToolbar *toolbar = [[[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)] autorelease];
    toolbar.items = [NSArray arrayWithObject:barButton];
    
    textField.inputAccessoryView = toolbar;
    

    【讨论】:

    • 我没听懂你。你想打什么电话?
    • 我有一个方法可以将文本保存到数据库中 [self saveString];
    • 您可以随时更改目标操作以调用关闭键盘并调用[self saveString]的方法。
    • 这是我做不到的:(你可以举个小例子吗?非常感谢!
    • 效果很好,但 UIBarButtonItemStyleDone 应该是 UIBarButtonSystemItemDone 否则按钮会显示 Edit。
    【解决方案2】:

    Swift 2.0 版本:

    //Declared at top of view controller
    var accessoryDoneButton: UIBarButtonItem!
    let accessoryToolBar = UIToolbar(frame: CGRectMake(0,0,UIScreen.mainScreen().bounds.width, 44))
    //Could also be an IBOutlet, I just happened to have it like this
    let codeInput = UITextField()
    
    //Configured in viewDidLoad()
    self.accessoryDoneButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Done, target: self, action: #selector(self.donePressed(_:)))
    self.accessoryToolBar.items = [self.accessoryDoneButton]
    self.codeInput.inputAccessoryView = self.accessoryToolBar
    

    斯威夫特 4:

    //Declared at top of view controller
    var accessoryDoneButton: UIBarButtonItem!
    let accessoryToolBar = UIToolbar(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 44))
    //Could also be an IBOutlet, I just happened to have it like this
    let codeInput = UITextField()
    
    //Configured in viewDidLoad()
    self.accessoryDoneButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.done, target: self, action: #selector(self.donePressed))
    self.accessoryToolBar.items = [self.accessoryDoneButton]
    self.codeInput.inputAccessoryView = self.accessoryToolBar
    
    func donePressed() {
        //Causes the view (or one of its embedded text fields) to resign the first responder status.
        view.endEditing(true)
    }
    

    UIToolBar Documentation

    'inputAccessoryView' documentation

    【讨论】:

    • donePressed 只是UIViewController 中的一个函数。如果我愿意,我通常会退出第一响应者的活动键盘,然后将视图控制器从导航堆栈中弹出。
    【解决方案3】:

    这可以更容易地完成!

    我在 IB 中创建了一个自定义视图,在我的 viewController.h 中我刚刚创建了一个 IBOutlet UIView *accessoryView;,将它们连接起来并创建了一个 - (IBAction)dismissKeyboard;

    我在视图中放置了一个带有完成按钮的工具栏,连接到 IBAction 并写道: [textView resignFirstResponder]

    - (void)viewDidLoad
    {
        textView.inputAccessoryView = accessoryView;
        [super viewDidLoad];
    }
    

    但实际上这看起来有点奇怪和非苹果风格......有什么想法吗?

    【讨论】:

      猜你喜欢
      • 2017-01-31
      • 2011-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-19
      • 2012-05-31
      • 1970-01-01
      相关资源
      最近更新 更多