为什么我的UITextField(由代码创建)不在我的tableview Cell中工作?

时间:2011-09-22 12:40:26

标签: objective-c cocoa-touch

我想要两个单元格登录(用户名和密码)。所以我运行应用程序,一切正常但是当我点击UITextField“playerTextField”时,程序收到了这个信号:“EXC_BAD_ACCESS”。 :(

你知道为什么吗?我已经尝试过并阅读了很多不同的方法,就像这一个我接近它的方式。

我的代码:

如果按下Next / Done按钮,键盘将消失。

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

我的UITextFields在单元格内。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *kCellIdentifier = @"kCellIdentifier";

    UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:kCellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 
                                       reuseIdentifier:kCellIdentifier] autorelease];
        cell.accessoryType = UITableViewCellAccessoryNone;



    if ([indexPath section] == 0) {
            playerTextField = [[UITextField alloc] initWithFrame:CGRectMake(110, 10, 185, 30)];
            playerTextField.adjustsFontSizeToFitWidth = YES;
            playerTextField.textColor = [UIColor blackColor];
            if ([indexPath row] == 0) {
                playerTextField.placeholder = @"ejemplo@gmail.com";
                playerTextField.keyboardType = UIKeyboardTypeEmailAddress;
                playerTextField.returnKeyType = UIReturnKeyNext;
                playerTextField.delegate = self;
            }
            else {
                playerTextField.placeholder = @"Requerida";
                playerTextField.keyboardType = UIKeyboardTypeDefault;
                playerTextField.returnKeyType = UIReturnKeyDone;
                playerTextField.secureTextEntry = YES;
                playerTextField.delegate = self;
            }       
            playerTextField.backgroundColor = [UIColor whiteColor];
            playerTextField.autocorrectionType = UITextAutocorrectionTypeNo; // no auto correction support
            playerTextField.autocapitalizationType = UITextAutocapitalizationTypeNone; // no auto capitalization support
            playerTextField.textAlignment = UITextAlignmentLeft;
            playerTextField.tag = 0;


            playerTextField.clearButtonMode = UITextFieldViewModeNever; // no clear 'x' button to the right
            [playerTextField setEnabled: YES];

            //cell.textLabel.font = [UIFont fontWithName:@"Helvetica-Bold" size:20.0];
            cell.textLabel.font = [UIFont fontWithName:@"Futura" size:16.0];
            cell.textLabel.textColor = [UIColor darkGrayColor];
            cell.textLabel.shadowOffset = CGSizeMake(0.5, 0.5);
            cell.textLabel.shadowColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:10];

            [cell.contentView addSubview:playerTextField];

            //[playerTextField release];
        }
    }
    if ([indexPath section] == 0) { // Email & Password Section
        if ([indexPath row] == 0) { // Email
            cell.textLabel.text = @"Email";
        }
        else {
            cell.textLabel.text = @"Contraseña";
        }
    }
    else { // Login button section
        cell.textLabel.text = @"Log in";
    }
    return cell;    
}

1 个答案:

答案 0 :(得分:0)

当您尝试访问已解除分配的对象时,会出现“EXC_BAD_ACCESS”错误。这意味着,在某处,释放了对UITextField的最后一个保留引用。

我在可见代码中看不到会导致此类问题的任何内容。

  • alloc - retain 1
  • addSubView - 保留2
  • 发布(您应该将其添加回来) - 保留1

仪器应该可以帮助您找出问题发生的位置。有一种叫做“Zombies”的乐器就是为了这个目的而设计的。当您到达EXC_BAD_ACCESS时,它将显示代码中保留和释放该对象的每个位置。从那里你可以找出你释放太多次的地方(或者可能忘了保留它)。