5

我有一个UITableViewCell(自定义单元格),我在其中创建一些按钮和文本字段并将标签分配给按钮和文本字段。但我无法在单击按钮时获得按钮标题和文本字段值。

cellForRowAtIndexPath

`[((CustomCell *) cell).btn setTag:rowTag];
 [((CustomCell *) cell).textField2 setTag:rowTag+1];`

-(IBAction)submitBtnAction:(UIControl *)sender
{
    for (int i=0; i<[self->_dataArray count]; i++)
    {
        NSIndexPath *myIP = [NSIndexPath indexPathForRow:i inSection:0];
        NSLog(@"myIP.row %d",myIP.row);
        UITableViewCell *cell = [tblView1 cellForRowAtIndexPath:myIP];
        NSLog(@"tag %d",cell.tag);
        UIButton *btn = (UIButton *)[cell.contentView viewWithTag:i];
        NSLog(@"btn text %@, tag %d",btn.titleLabel.text,btn.tag);
        UITextField *tf = (UITextField *)[cell.contentView viewWithTag:i+1];
        NSLog(@"tf text %@, tag %d",tf.text,btn.tag);

    }
}

我收到这样的错误

-[UITableViewCellContentView titleLabel]: unrecognized selector sent to instance 0x71844e0
2013-07-17 13:48:29.998 Text[1271:c07] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UITableViewCellContentView titleLabel]: unrecognized selector sent to instance 0x71844e0'
4

7 回答 7

11

我认为你可以直接访问你的单元格的btntextField2属性,一旦你从cellForRowAtIndexPath:. 假设您正在创建并返回 的实例CustomCell,只需将其类型转换为CustomCell而不是UITableviewCell. 请参阅下面的修改代码

-(IBAction)submitBtnAction:(UIControl *)sender
{
        UIButton *button = (UIButton*)sender;
        NSIndexPath *myIP = [NSIndexPath indexPathForRow:sender.tag inSection:0];
        //Type cast it to CustomCell
        CustomCell *cell = (CustomCell*)[tblView1 cellForRowAtIndexPath:myIP];
        UIButton *btn = cell.btn;
        NSLog(@"btn text %@, tag %d",btn.titleLabel.text,btn.tag);

        UITextField *tf = cell.textField2;
        NSLog(@"tf text %@, tag %d",tf.text,btn.tag);
}

希望有帮助!

于 2013-07-17T08:34:29.930 回答
2

简单的方法:

-(IBAction)submitBtnAction:(UIControl *)sender
{
   UIButton *senderButton = (UIButton *)sender;

    NSIndexPath *myIP = [NSIndexPath indexPathForRow:i inSection:0];

    CustomCell *cell = (CustomCell*)[tblView1 cellForRowAtIndexPath:myIP];

    NSLog(@"cell.textField -tag :%d",cell.textField2.tag);

    NSLog(@"cell.btn -tag :%d",cell.btn.tag);

}
于 2013-07-17T08:44:49.267 回答
1

以下代码通过“事件”参数获取 indexPath 可能会更好:

-(IBAction)submitBtnAction:(UIControl *)sender event:(id)event
{
    UITouch *touch = [[event allTouches] anyObject];
    CGPoint touchPos = [touch locationInView:self.tableView];
    NSIndexPath *indexPath = [self.tableView  indexPathForRowAtPoint:touchPos];
    if(indexPath != nil)
    {
       //Todo: get model at indexPath, update cell or something other 
    }
}

submitBtn 的目标选择器确认更改为@selector(submitBtnAction:event:)

于 2013-12-18T08:57:30.673 回答
0

通常当您收到unrecognized selector错误时,这是​​因为您正在访问已在内存中替换的对象。在您的情况下,您可能正在访问不可见的 Cell ,因此contentview返回nil

当您执行 for 循环时,您似乎可以访问所有单元格,这对于不可见的单元格是不可能的。对我来说,您只能访问可见单元格,否则contentview为 nil,因此访问titleLabel会给您带来无法识别的选择器错误。

于 2013-07-17T08:26:52.623 回答
0

问题是您将视图的子视图设置为标记 0,而视图的标记属性默认值为 0,并[someview viewWithTag:0]返回 someview 本身。

于 2013-07-17T10:22:01.550 回答
0

为标签值添加填充。否则第一行标签为 0 并且与内容视图标签匹配,所有视图标签默认为 0。因此,为什么当标签等于 0 时您会得到错误的视图。

#define PADDING 100
[((CustomCell *) cell).btn setTag:PADDING + rowTag];
[((CustomCell *) cell).textField2 setTag:PADDING + rowTag+1];

但是,我会将解决方案更改为根本不使用增量标签,而是使用静态标签。您已经有了特定的单元格,cellForRowAtIndexPath:您所需要的只是该单元格的按钮。

#define BUTTON_TAG 10
#define TEXT_TAG 11

cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:@"CustomCell"];
if (cell == nil) {
    cell = [[[CustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"CustomCell"] autorelease];
    [((CustomCell *) cell).btn setTag:BUTTON_TAG];
    [((CustomCell *) cell).textField2 setTag:TEXT_TAG];
}

-(IBAction)submitBtnAction:(UIControl *)sender
{
    for (int i=0; i<[self->_dataArray count]; i++)
    {
        NSIndexPath *myIP = [NSIndexPath indexPathForRow:i inSection:0];
        NSLog(@"myIP.row %d",myIP.row);
        UITableViewCell *cell = [tblView1 cellForRowAtIndexPath:myIP];
        UIButton *btn = (UIButton *)[cell.contentView viewWithTag:BUTTON_TAG];
        NSLog(@"btn text %@, tag %d",btn.titleLabel.text,btn.tag);
        UITextField *tf = (UITextField *)[cell.contentView viewWithTag:TEXT_TAG];
        NSLog(@"tf text %@, tag %d",tf.text,btn.tag);

    }
}
于 2013-07-17T08:43:09.740 回答
0

我会这样做的方式是。我通过一个函数来处理 TableViewController 中的事件作为 TableViewcell 的委托,并注册事件以调用委托函数,然后将其回调。这是我的做法

在 tableview 控制器 cellForRow 函数中

        let cell = tableView.dequeueReusableCell(withIdentifier: "blablabla") as! FeedbackTableViewCell
        cell.buttonEventDelgate = buttonPressed
        cell.indexPath = indexPath //This is required to find which cell button was pressed
        return cell

在 TableViewcell 中,当用户单击按钮时,我调用此委托

回到 Tableviewcontroller,我将按如下方式实现委托

 @objc func buttonPressed(sender: UIButton, indexPath: IndexPath) -> Void {
    print("button pressed \(indexPath.row)")
  }

希望这可以帮助!!!让我知道是否有更好的方法来做到这一点

于 2019-01-06T23:04:03.240 回答