【问题标题】:iOS - can't get rid of keyboardiOS - 无法摆脱键盘
【发布时间】:2023-04-07 15:42:01
【问题描述】:

我有一个文本字段供用户输入字符串,然后另一个文本字段在单击时会显示一个向上滑动的视图,其中包含一个日期选择器。

如果用户单击第一个文本字段并使用键盘输入一个字符串,然后点击键盘上的返回按钮,则键盘消失。但是,如果他们在第一个文本字段中输入字符串后单击日期文本字段,则键盘将停留在屏幕上。

我试过这个:

@property (weak, nonatomic) IBOutlet UITextField *nameField;
@property (weak, nonatomic) IBOutlet UITextField *dateField;

....

- (BOOL) textFieldShouldBeginEditing:(UITextField *)textField {
    return(![textField isEqual:self.dateField]);
}

它不起作用。 我也试过这个(这是在用户点击 dateField 时开始编辑时触发的):

- (IBAction)dateTextFieldClicked:(id)sender {
    [self.nameField resignFirstResponder];
}

然后是这个:

- (IBAction)dateTextFieldClicked:(id)sender {
    [self.view endEditing:YES];
}    

这些都不起作用。我想要做的甚至可能吗?我应该放弃还是有什么可行的方法?

【问题讨论】:

  • 当您的键盘没有关闭时,它有点令人困惑。您能否提供屏幕截图以进行更多说明? @Manuel

标签: ios keyboard


【解决方案1】:

试试这个..

- (IBAction)dateTextFieldClicked:(id)sender {
[self.nameField resignFirstResponder];
[self.view endEditing:YES]; }    

【讨论】:

  • @ManuelManningtonTheThird 您是否在界面中添加了 uitextfielddelegate 并为您的两个文本字段设置了代表?
  • @ManuelManningtonTheThird 那你为什么不试试委托方法呢?你可以使用我下面提到的委托方法: - (void)textFieldDidBeginEditing:(UITextField *)textField { if (textField== nameField) { [self.dateField resignFirstResponder]; } else if (textField== dateField){ [self.nameField resignFirstResponder]; } }
【解决方案2】:

在您的 viewDidLoad() 中试试这个:

 [self.nameTextField addTarget:self action:selector@(nameFieldClicked:) forControlEvents:UIControlEventEditingDidEnd]

并将dataTextFieldClicked() 中的参数更正为

 - (IBAction)dateTextFieldClicked:(UITextField *)sender {
    [sender resignFirstResponder];    
}

Apple 推出 Swift 时,我只是一名 iOS 开发者,这意味着我上面写的代码可能有一些语法错误,但没有逻辑错误。

希望我的回答能帮到你。

【讨论】:

  • 我把它正确地翻译成objective-c,它不起作用。所以它会是 [self.nameTextField addTarget:self action:selector@(nameFieldClicked:) forControlEvents:UIControlEventEditingDidEnd]; - (IBAction)dateTextFieldClicked:(id)sender { UITextField *name = (UITextField *)sender; [姓名 resignFirstResponder]; }
  • 更正你的dataTextFieldClicked(),比如[sender resignFirstResponder]
  • 当我在 Swift 中完成绑定时,我使用此方法块将 UITextField 移出屏幕。不同之处在于我在Connection Inspector 中使用Send Events 设置了Storyboard 中的UI 对象,而不是addTarget( )
  • 如果你使用了Storyboard,你可以将UITextFieldEditing Did End连接到dataTextFieldClicked()。而- (IBAction)dataTextFieldClicked()的返回值应该是void,比如- (void)dataTextFieldClicked()
【解决方案3】:

有一个简单的方法,我遇到了同样的问题。将 dateField 作为 UIButton,而不是 UITextField。在 Button 操作中设置如下:

- (IBAction)Date_set:(id)sender
 {
    [self.view endEditing:YES];
    [self YourDatePickerset];
} 

当 DatePicker 值这样改变时设置按钮的标题

- (void)pickerChanged:(id)sender
{
    NSDateFormatter *dateformate=[[NSDateFormatter alloc]init];
    [dateformate setDateFormat:@"dd LLL yyyy"]; // Date formater
    NSString *date = [dateformate stringFromDate:[myPicker date]]; // Convert date to string
    NSLog(@"date :%@",date);
    [dob_btn setTitle:date forState:UIControlStateNormal];
}

【讨论】:

    【解决方案4】:

    你能用这个sn-p,让我告诉结果

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

    确保所有文本字段的委托都设置为 self

    也试试这个
    编辑

    -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    [dateField resignFirstResponder];    
    [nameField resignFirstResponder];
    }
    

    【讨论】:

    • 好的,只需在触摸开始方法中为两个文本字段辞职......(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ [dateField resignFirstResponder]; [nameField resignFirstResponder]; }
    猜你喜欢
    • 2010-11-30
    • 2015-12-16
    • 2012-10-14
    • 1970-01-01
    • 2015-04-06
    • 2013-06-20
    • 2015-10-03
    • 2016-11-18
    相关资源
    最近更新 更多