我的UITableView
超出了屏幕区域。我显示了NSMutableArray
中填充了NSDictionary
个对象的一些数据。对象都具有group
属性true
或false
,如果group
为真,则应在单元格中显示UIButton
(以展开群组)。
我在UIButton
的单元格prototype
中创建了storyboard
。我给它alpha
0.如果我加载列表按钮不在任何单元格(duh)。这是我的cellForRowAtIndexPath
:
if ([[contacts[indexPath.section] valueForKey:@"group"] isEqualToString:@"true"]) {
UIButton *button = (UIButton*)[cell viewWithTag:999];
[button setAlpha:1.0f];
}
如果group
属性为true
,则按钮可见。在我当前的测试用例中,前三个对象的group
设置为true
,其余的group
设置为false
。现在我的问题是,前三个单元格有一个可见的按钮(按预期),但是沿着表格的一些单元格也有一个。我在上面的if statement
中加了一个断点,它实际上只有三次。
它发生在一个模式中,前三个单元格有一个按钮,而不是五个单元格,而另外三个单元格有一个可见按钮。比另外五个没有按钮和最后一个单元格(我想如果我添加两个单元格,他们也将有一个按钮)
具有按钮的第二组单元格在屏幕外部开始,因此可能与它有关。
还有一个相关的事情,还有一些文本显示我从同一个数组中取出组标记,这个文本显示正确。因此,细胞不是以某种方式重复,而只是if statement
部分被搞砸了。
我仔细检查了程序进入if statement
的次数,它实际上只有三次(前三个条目)。如果我对按钮上的setAlpha
电话进行评论,则任何地方都不会显示任何按钮,因此也没有其他位置可以显示该按钮。
我在使用iOS 7.1的iPad 4上进行测试。
如果我减少行的高度以使它们全部适合屏幕,则问题就消失了,所以它在加载数据时肯定与落在屏幕区域之外的行有关。
修改
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = nil;
UIColor *color = [UIColor colorWithRed:(1.0f/255.0f)*220 green:(1.0f/255.0f)*220 blue:(1.0f/255.0f)*225 alpha:1.0f];
if (indexPath.row == 0) {
cell = [tableView dequeueReusableCellWithIdentifier:@"single" forIndexPath:indexPath];
UILabel *screenname = (UILabel*)[cell viewWithTag:10];
UILabel *username = (UILabel*)[cell viewWithTag:11];
UIImageView *avatar = (UIImageView*)[cell viewWithTag:20];
if ([[contacts[indexPath.section] valueForKey:@"group"] isEqualToString:@"true"]) {
NSDictionary *c = contacts[indexPath.section];
UIButton *button = (UIButton*)[cell viewWithTag:999];
[button setAlpha:1.0f];
button.tag = indexPath.section;
[button addTarget:self action:@selector(onGroupButtonClick:) forControlEvents:UIControlEventTouchUpInside];
int numUsersInGroup = [[c valueForKey:@"users"] count];
NSString *numUsersInGroupString = [NSString stringWithFormat:@"%d",numUsersInGroup];
[button setTitle:numUsersInGroupString forState:0];
[button setNeedsDisplay];
screenname.text = @"Groep";
username.text = [NSString stringWithFormat:@"%@",[c valueForKey:@"groupName"]];
} else {
User *c = (User*)contacts[indexPath.section];
UIButton *button = (UIButton*)[cell viewWithTag:999];
[button setAlpha:0.0f];
screenname.text = [NSString stringWithFormat:@"%@",[c valueForKey:@"screenName"]];
username.text = [NSString stringWithFormat:@"%@",[c valueForKey:@"username"]];
[avatar setImage:[UIImage imageNamed:@"avatar.png"]];
}
[GeneralFunctions setFontFamily:@"KozGoPro-ExtraLight" forView:cell andSubViews:YES];
[GeneralFunctions setFontFamily:@"KozGoPro-Medium" forView:screenname andSubViews:YES];
[cell.layer setShadowColor:[color CGColor]];
[cell.layer setShadowOffset:CGSizeMake(0,4)];
[cell.layer setShadowRadius:3.0f];
[cell.layer setShadowOpacity:1.0f];
cell.clipsToBounds = NO;
cell.layer.masksToBounds = NO;
}
if (indexPath.row > 0) {
cell = [tableView dequeueReusableCellWithIdentifier:@"group" forIndexPath:indexPath];
UILabel *screenname = (UILabel*)[cell viewWithTag:10];
UILabel *username = (UILabel*)[cell viewWithTag:11];
User *c = (User*)[contacts[indexPath.section] valueForKey:@"users"][indexPath.row-1];
screenname.text = [NSString stringWithFormat:@"%@",[c valueForKey:@"screenName"]];
username.text = [NSString stringWithFormat:@"%@",[c valueForKey:@"username"]];
[GeneralFunctions setFontFamily:@"KozGoPro-ExtraLight" forView:cell andSubViews:YES];
[GeneralFunctions setFontFamily:@"KozGoPro-Medium" forView:screenname andSubViews:YES];
}
return cell;
}
答案 0 :(得分:1)
重复使用单元格时,您不会将按钮设置回0.0
alpha。每当您重复使用单元格时,您需要重置单元格或更改单元格的属性,否则它将显示旧内容
if ([[contacts[indexPath.section] valueForKey:@"group"] isEqualToString:@"true"]) {
NSDictionary *c = contacts[indexPath.section];
UIButton *button = (UIButton*)[cell viewWithTag:999];
[button setAlpha:1.0f];
//this line changes your tag and hence in else condition for reused cell it'll come nil
button.tag = indexPath.section;
} else {
UIButton *button = (UIButton*)[cell viewWithTag:999];
[button setAlpha:0.0f];
}
建议而不是按标签访问按钮,通过使用属性按类型将单元格转换为自定义单元格来访问它