0

iPhone 应用程序:

  • 我有一个带有 3 个文本字段的屏幕,用于输入姓名、电子邮件和位置。
  • 我使用了 2 个部分的分组表视图。
  • 在 tat 第一部分有三个单元格..每个单元格都有一个标签 na 文本字段..例如:名为名称的标签和一个用于输入名称的文本框.. 明智地我也有它用于电子邮件和位置..

已将界面中的 nameTextField、emailTextField、locationTextField 声明为变量而不是属性。所以请告诉我如何在这里关闭键盘

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{


    CommonTableViewCell* cell = [[CommonTableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@""];
    cell.textLabel.backgroundColor = [UIColor clearColor];
    cell.textLabel.textColor = [UIColor blackColor];
    cell.textLabel.highlightedTextColor = [UIColor whiteColor];
    cell.textLabel.font = [UIFont fontWithName:@"Arial" size:14];//
    cell.textLabel.font = [UIFont boldSystemFontOfSize:14];
    //cell.image = [UIImage imageNamed:@"resources_on.png"];
    cell.textLabel.frame = CGRectMake(TABLE_ROW_HEIGHT + 10, 5, self.view.frame.size.width , 25);

    if (indexPath.section == 0) {
        if (indexPath.row  == 0) {
            cell.textLabel.text = @"Username";

            nameTextField = [[UITextField alloc] initWithFrame:CGRectMake(140, 18, 300, 20)];
            [nameTextField setBackgroundColor:[UIColor clearColor]];
            [nameTextField setFont:[UIFont fontWithName:@"Arial" size:14]];
            nameTextField.placeholder = @"Enter anonymous name";
            [nameTextField setKeyboardType: UIKeyboardTypeNamePhonePad];
            [cell addSubview:nameTextField];
            [nameTextField release];

        }else if (indexPath.row == 1) {

            cell.textLabel.text = @"Email"; 
            emailTextField = [[UITextField alloc] initWithFrame:CGRectMake(140, 18, 300, 20)];
            [emailTextField setBackgroundColor:[UIColor clearColor]];
            [emailTextField setFont:[UIFont fontWithName:@"Arial" size:14]];
            emailTextField.placeholder = @"example@me.com";
            [emailTextField setKeyboardType:UIKeyboardTypeEmailAddress];
            [cell addSubview:emailTextField];
            [emailTextField release];

        }else if (indexPath.row == 2) {

            cell.textLabel.text = @"Location";
            locationTextField = [[UITextField alloc] initWithFrame:CGRectMake(140, 18, 300, 20)];
            [locationTextField setBackgroundColor:[UIColor clearColor]];
            [locationTextField setFont:[UIFont fontWithName:@"Arial" size:14]];
            locationTextField.placeholder = @"Fetch";
            [cell addSubview:locationTextField];
            [locationTextField release];

        }else if (indexPath.row == 3) {

            cell.textLabel.text = @"Terms of Use";

            cell.thumbnailView.image = [UIImage imageNamed:@"compensation_on.png"];

        }else if (indexPath.row == 4) {

            cell.textLabel.text = @"Privacy Policy";

            cell.thumbnailView.image = [UIImage imageNamed:@"compensation_on.png"];

        }else {

        }
    } else if (indexPath.section == 1) {
        if (indexPath.row == 0) {

            cell.textLabel.text = @"Terms of Use";

            cell.thumbnailView.image = [UIImage imageNamed:@"compensation_on.png"];

        }else if (indexPath.row == 1) {

            cell.textLabel.text = @"Privacy Policy";

            cell.thumbnailView.image = [UIImage imageNamed:@"compensation_on.png"];

        }else {

        }

    }


    return cell;
}

这对我不起作用..

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

2 回答 2

2

先试试谷歌:search?q=textfield+resignfirstresponder+not+hiding+the+keyboard

stackoverflow上有很多这样的问题。

例子:

该字段是否在 a 内UIModalPresentationFormSheet?如果是这样,这是一个已知问题,您无法以编程方式关闭键盘,直到视图控制器被关闭。

有解决此问题的方法,请在此处查看问题。

来自:https ://stackoverflow.com/a/6854165/672989 :

于 2013-01-22T09:01:25.807 回答
1

您应该为您UITextField的 s 分配一个代表。

您的数据源(或任何其他对象,但这个似乎适合这项工作)应该符合<UITextFieldDelegate>协议。

 ...
 nameTextField = [[UITextField alloc] initWithFrame:CGRectMake(140, 18, 300, 20)];
 [nameTextField setBackgroundColor:[UIColor clearColor]];
 [nameTextField setFont:[UIFont fontWithName:@"Arial" size:14]];
 nameTextField.placeholder = @"Enter anonymous name";
 [nameTextField setKeyboardType: UIKeyboardTypeNamePhonePad];

 [nameTextField setDelegate:self]; //add this line

 [cell addSubview:nameTextField];
 //[nameTextField resignFirstResponder]; this doesn't really make sense - creating the text
 //field should not (and does not) bring up the keyboard
 [nameTextField release];
 ....

对其他UITextFields 做同样的事情。

然后检查您的delegate方法是否被调用(例如使用 NSLog 或断点):

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    NSLog (@"should return?"); 
    [textField resignFirstResponder]; 
    return YES; 
}

编辑

您只需为每个UITextField设置一次委托- 通常是在创建它时。

要告诉编译器某个类符合<UITextFieldDelegate>协议,只需@interface在头文件中的类声明之后添加。

例如,如果您用作表的数据源的类名为 MyDataSource:

@interface MyDataSource: NSObject <UITableViewDelegate,UITextFieldDelegate>

当然,您必须实现所有必需的方法才能正确符合某个协议。请查看文档:UITextFieldDelegate 协议参考

编辑:至于检查电子邮件的有效性:你可以检查有效性(这实际上是另一个问题)你可以这样做- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string

由于您的委托对象被委托给多个 UITextField 您必须首先检查正在编辑的文本字段是否是保存电子邮件的文本字段。而且由于您的文本字段位于表格单元格中,因此很难(并且不正确)保持对所有这些字段的引用。您可以使用标签将电子邮件文本字段与其他字段分开 - 让我们将其设为 44。稍微修改您的代码:

emailTextField = [[UITextField alloc] initWithFrame:CGRectMake(140, 18, 300, 20)];
emailTextField.tag = 44; //add this line

然后添加委托方法:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    if (textField.tag == 44)
    {
        //email checking code here
    }
    else
    {
        return YES;
    }
}

至于如何查邮件,看看这个答案:https ://stackoverflow.com/a/7707946/653513

于 2013-01-22T09:24:15.217 回答