从按下按钮获取自定义UITableViewCell的自定义标识符

时间:2013-12-17 13:31:15

标签: ios objective-c uitableview

我有一个使用自定义UITableViewCell和自定义UIButton的应用。其名称为CustomCellCustomButton CustomButtonCustomCell都有标识符。 CustomButtonbuttonIdentifierCustomCellcellIdentifier。创建表时,它们都获得相同的ID。此单元格还有另一个名为projectFullName的自定义属性。

示例:

NSString *tempString    = @"temp"; // The content is always different
button.buttonIdentifier = tempString;
cell.cellIdentifier     = tempString;
cell.projectFullName    = @"temp"; // The content is always different

现在,我想要做的是,当我按下按钮时,我也得到了单元格textLabel的内容。所以我基本上做的是。

-(void)editProject:(id)sender {
    stringEditIdentifier            = ((CustomButton *)sender).projectButtonIdentifier;
    UIAlertView *alertView          = [[UIAlertView alloc] initWithTitle:@"Projektname"
                                                             message:@""
                                                            delegate:self
                                                   cancelButtonTitle:@"Abbrechen"
                                                   otherButtonTitles:@"Speichern", nil];
    [alertView setAlertViewStyle:UIAlertViewStylePlainTextInput];
    [alertView show];
}

但我现在想要做的是通过执行以下操作预填充输入字段

[alertView textFieldAtIndex:0].text = labelCellName;

labelCellname是我之前分配的textLabel文字的名称。由于CustomCellCustomButton具有相同的标识符,我认为获取内容相当容易,但我的应用始终崩溃。这就是我的尝试。

首先尝试

CustomButton *buttonTemporary   = (CustomButton *)sender;
CustomCell *cellTemporary       = (CustomCell *)[buttonTemporary superview];
NSString *labelCellName         = cellTemporary.projectFullName;

错误

UITableViewCellScrollView projectFullName]: unrecognized selector sent to instance 0xa895df0
2013-12-17 14:17:09.279 TodolistiOS[17702:70b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UITableViewCellScrollView projectFullName]: unrecognized selector sent to instance 0xa895df0'

第二次尝试

int row                         = ((CustomButton *)sender).tag;
NSIndexPath* indexPath          = [NSIndexPath indexPathForRow:row inSection:0]; // in case this row in in your first section
CustomCell* cell                = (CustomCell *)[tableView cellForRowAtIndexPath:indexPath];
NSString *labelCellName         = cell.projectFullName;

错误

应用程序崩溃没有错误。但是,如果我在UITableView中有三个条目,它们都有不同的名称labelCellName,则始终是第一个条目的名称。所以当我点击第二个条目中的CustomButton时,我仍然会得到第一个条目的名称。我究竟做错了什么?我希望我已经提供了足够的信息,因为我的上一个问题并不是那么好。

第三次尝试

CustomButton *button    = (CustomButton*)sender;
NSIndexPath *myIP       = [NSIndexPath indexPathForRow:button.tag inSection:0];
CustomCell *cellT       = (CustomCell*)[tableView cellForRowAtIndexPath:myIP];
NSString *testTemp      = cellT.projectFullName;
NSLog (@"%@" , testTemp );

错误

与第二次尝试相同

另外,当我这样做时

CustomButton *button    = (CustomButton*)sender;
NSLog ( @"%d", button.tag );

button.tag始终为空。是这个,因为我没有设置它?如果是,我应该如何正确设置?我的意思是,价值是动态的,因为我永远不会知道我会有多少条目!是否无法通过cellIdentifierbuttonIdentifier获取它,因为它们无论如何都是相同的?

第四次尝试

我现在手动为按钮添加了标签ID。

editButton.tag = tagCount;
tagCount       = tagCount+1;

这一直有效,直到我向CustomCell UITableView添加新行。然后tagCount搞砸了,它不再起作用了。

2 个答案:

答案 0 :(得分:0)

在你的cellForRowAtIndexPath

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

[[customCell button] setTag:indexPath.row];
return cell;
}

单击按钮时,获取文本标签的单元格和文本:

UITableViewCell cell = [(UITableViewCell *)[(UITableView *)self  cellForRowAtIndexPath:   [NSIndexPath indexPathForRow:button.tag inSection:0]];

NSString *text = [cell yourLabel].text;

当然,你必须在你的uitableviewcell类中定义你的按钮和你的标签作为属性。

答案 1 :(得分:0)

我现在设法做了一个自己的解决方案。但这似乎不对。我正在使用for循环遍历CustomCell中的每个UITableView。但是当我有1000个条目时,这可能是性能问题,不是吗?

stringEditIdentifier            = ((CustomButton *)sender).projectButtonIdentifier;
NSString *labelCellText         = @"";

for(int i = 0; i < [tableView numberOfRowsInSection:0]; i++)
{
    NSIndexPath *index          = [NSIndexPath indexPathForRow:i  inSection:0];
    CustomCell *cell            = (CustomCell *)[tableView cellForRowAtIndexPath:index];
    NSString *textFieldVal      = [cell.textLabel text];
    NSString *cellIdentifier    = cell.projectCellIdentifier;

    if ( [cellIdentifier isEqualToString:stringEditIdentifier ] ){
        labelCellText     = textFieldVal;
    }

}
UIAlertView *alertView          = [[UIAlertView alloc]  initWithTitle:@"Projektname"
                                                              message:@""
                                                             delegate:self
                                                    cancelButtonTitle:@"Abbrechen"
                                                    otherButtonTitles:@"Speichern", nil];

[alertView setAlertViewStyle:UIAlertViewStylePlainTextInput];
[alertView textFieldAtIndex:0].text = labelCellText;
[alertView show];