如何在iPhone sdk中创建可访问的多个自定义文本字段

时间:2012-01-16 22:12:43

标签: iphone ios

下面是我的代码,如代码中所示如果我的表有多行而不能访问该文本字段意味着我可以键入文本但我的键盘不会消失,如果我只有一行而不是它是可访问的,任何人都可以帮助我如何使多个文本字段可访问,因为我想动态创建它而不是通过修复代码

textField1 = [[UITextField alloc] initWithFrame:CGRectMake(0, 270, 21, 21)];
textField1.placeholder = @"0";

textField1.delegate = self;
textField1.text = [numberofevent objectAtIndex:indexPath.row];

cell.accessoryView = textField1 ;
[self textFieldShouldReturn:textField1];
[textField1 addTarget:self action:@selector(textChanged:) forControlEvents:UIControlEventEditingDidEnd];
[textField1 release];

这个是用于辞职键盘代码

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

,最后一个是我的文字值更改事件

- (void) textChanged:(UITextField *)source {
}

所以,这个代码运行任意数量的行,但是当行不止一个时它不能提供访问权限,那么如何根据需要在一个代码中生成多个文本字段以及如何访问它。

2 个答案:

答案 0 :(得分:0)

我认为存在涉及textField1的问题。首先,它显然是一个实例变量,因为你是从至少两种方法访问它,但你在我认为cellForRowAtIndexPath(这里是你的第一个代码块)的末尾释放它,然后在那之后真的不应该再引用textField1(即使它被单元格保留)。所以我认为textField1根本不应该是一个ivar。第二个问题是,您始终在textField1而不是textFieldShouldReturn:中引用textField。谁知道在调用textField1textFieldShouldReturn:将引用的内容,但textField将始终引用应返回的任何文本字段。

简而言之,我认为您需要改变这一点:

[textField1 resignFirstResponder];

到此:

[textField resignFirstResponder];

我也不确定你为什么要在cellForRowAtIndexPath中调用textFieldShouldReturn。您还应该使用另一种UITextFieldDelegate方法,而不是将自己的操作/目标添加到文本字段中。

这可能会解决您的主要问题,除非您的其余代码中存在其他问题。

编辑:让我试着更清楚地解释一下。每行有一个文本字段。当所有单元格都在cellForRowAtIndexPath中创建时,textField1引用到最后创建的文本字段。您的textFieldShouldReturn方法始终是指textField1。它应该引用它的参数textField,它对应于启动返回时作为第一响应者的实际文本字段。

答案 1 :(得分:0)

请注意,这不是一个好的代码,但应该让您启动并运行。重复使用代码中的视图和内容,正确设置文本字段等。基本上你现在的错误是你为每个单元格使用了1个文本字段。

   - (UITableViewCell *)tableView:(UITableView *)tableView_ cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    {
        UITableViewCell *cell   = [tableView_ dequeueReusableCellWithIdentifier:@"Cell"];
        if (!cell)
        {
            UITextField* textField = [[UITextField alloc] initWithFrame:CGRectMake(0, 270, 21, 21)];
            textField.placeholder = @"0";
            textField.delegate = self;
            textField.text = [numberofevent objectAtIndex:indexPath.row];
            cell.accessoryView = textField;
        }
        // do something else here if the cell is reused
    }