我试图在基于JSON的布尔值时显示处于选中状态的按钮。这是我的自定义UITableViewCell的代码:
TwitterCell *cell = [self.tableView dequeueReusableCellWithIdentifier:@"TwitterCell"];
if (cell == nil) {
cell = [[TwitterCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"TwitterCell"];
}
NSDictionary *data = tweets[indexPath.row];
id favorited = data[@"favorited"];
NSLog(@"%@",favorited);
id retweeted = data[@"retweeted"];
NSLog(@"%@",retweeted);
if ((int)favorited == 1) {
[cell.favoriteButton select];
} else {
[cell.favoriteButton deselect];
}
if ((int)retweeted == 1) {
[cell.retweetButton select];
} else {
[cell.retweetButton deselect];
}
以下是我的自定义TableViewCell类中可能存在的问题。我准备重用的地方:
- (void)prepareForReuse
{
[super prepareForReuse];
self.favoriteButton.selected = NO;
self.tweetLabel.text = nil;
self.profilePicture.image = nil;
self.nameLabel.text = nil;
self.retweetButton.selected = NO;
self.usernameLabel.text = nil;
}
答案 0 :(得分:1)
您提供的代码存在一些问题。
NSNumber
投射到int
从字典中检索favorited
(可能是数字)将返回NSNumber
,这是数字的包装类。当你NSLog
时,它将打印出description
方法的结果,基本上打印出基础数字。
当您将NSNumber
转换为int
时,您不会获得基础数字,而是以整数格式获取内存地址。
请参阅此代码和一些示例输出:
NSNumber *favorited = @(1);
NSLog(@"%@", favorited);
NSLog(@"%d", (int)favorited);
favorited = @(0);
NSLog(@"%@", favorited);
NSLog(@"%d", (int)favorited);
输出
2015-08-19 07:04:36.235 xctest[589:7545] 1
2015-08-19 07:04:36.236 xctest[589:7545] 18
2015-08-19 07:04:36.236 xctest[589:7545] 0
2015-08-19 07:04:50.720 xctest[589:7545] 2
要检索基础数字,必须使用适当的*value
方法之一,例如integerValue
或longValue
。
select
和deselect
除非您已创建自定义子类,否则UIButton
上不存在这些方法。要正确调整按钮的选定状态,您需要像prepareForReuse
方法一样使用selected
属性。
button.selected = YES; // or NO
根据以上信息,我们可以更改部分细胞创建方法如下:
if ([favorited integerValue] == 1) {
cell.favoriteButton.selected = YES;
} else {
cell.favoriteButton.selected = NO;
}
if ([retweeted integerValue] == 1) {
cell.retweetButton.selected = YES;
} else {
cell.retweetButton.selected = NO;
}
答案 1 :(得分:0)
我认为问题在于
(int)favorited == 1
只需使用[favorited intvalue]
即可。