我的应用程序中有一个UITableView,它存储了一个URL列表。上表有UITextField和UIButton。
当用户在textField上键入一些URL然后按下按钮时,我会像tableView中的top元素一样添加这些URL。
接下来,当用户选择任何URL时,我想在选定的UITableViewCell中创建一个按钮,让用户可以关注该URL(实际上,这并不重要)。这是didSelectRowAtIndexPath
方法定义:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [self.recentUrlsTableView cellForRowAtIndexPath:indexPath];
UIButton *button = [UIButton new];
button.frame = CGRectMake(cell.frame.size.width - 34, cell.frame.origin.y + 10, 24, 24);
button.backgroundColor = [UIColor lightGrayColor];
[button setTitle:@">" forState:UIControlStateNormal];
[cell.contentView addSubview:button];
[button release];
}
但是当我取消选择单元格时,我希望这些按钮消失。所以,我尝试了这个东西(我觉得它看起来很愚蠢,但不幸的是我不知道在那里找到我的按钮的更好方法):
- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [self.recentUrlsTableView cellForRowAtIndexPath:indexPath];
for (UIView *subview in cell.subviews)
{
if ([subview isKindOfClass:[UIButton class]])
if ([[(UIButton*)subview titleLabel].text isEqualToString:@">"])
{
[subview removeFromSuperview];
[subview release];
}
}
}
但这些东西似乎工作不正确 - 而不是释放和消失,按钮开始在另一行 - 甚至那些是空的。
之后,我尝试对- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
方法中的每一行执行相同的操作。但它也没有帮助。
我想,有一些微不足道的问题,但我找不到它。所以,我将非常感谢您的任何帮助!
答案 0 :(得分:1)
当您向上/向下滚动表格时,可以重复使用表格单元格,并且可以使用完全不同的内容填充单元格(带按钮)(即用于不同的索引路径)。这就是你遇到这种情况的原因。
所以桌子上总是只有一个按钮(或没有按钮)。
如果您从桌子外面创建一个按钮(reatin&保持参考),那么你最好。您的didDeselectRowAtIndexPath
将会是这样的:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [self.recentUrlsTableView cellForRowAtIndexPath:indexPath];
//you have outside reference for this button
[button removeFromSuperView];
button.frame = CGRectMake(cell.frame.size.width - 34, cell.frame.origin.y + 10, 24, 24);
[cell.contentView addSubview:button];
}
如果这不起作用,您应该使用reloadData和cellForIndexPath的组合。像这样:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[self.recentUrlsTableView reloadData];
}
- (void)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
//create your cell as usually
if ([cell isSelected]) { //i'm not sure if this is the right way to detect selected cell
[button removeFromSuperView];
button.frame = CGRectMake(cell.frame.size.width - 34, cell.frame.origin.y + 10, 24, 24);
[cell.contentView addSubview:button];
}
}