我遇到过这样的事件,其中UITableView
单元格内容在iOS 9上正常加载,但在iOS 8上没有加载。我已在模拟器和设备上验证了这一点。
我已尝试在viewDidLoad
,viewWillAppear
甚至viewDidAppear
上加载数据,但仍然相同。我已尝试dispatch_async
重新加载tableView
但仍然相同。
检查下面的图片,看看我遇到的问题。
然而,当我点击星星的位置时,突然出现UIView
星星。
以下是UITableView
控制器的代码。
@interface EvalTableViewController ()
@property (strong, nonatomic) NSDictionary *allItems;
@property (strong, nonatomic) NSArray *items;
@property (strong, nonatomic) NSMutableArray *ratings;
@end
@implementation EvalTableViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.tableView.estimatedRowHeight = 140.0;
self.tableView.rowHeight = UITableViewAutomaticDimension;
_allItems = [[NSDictionary alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"AssessmentItems" ofType:@"plist"]];
_items = nil;
_items = [_allItems objectForKey:_currentEval];
[self loadRatings];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
}
#pragma mark - Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return _items.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *identifier = @"itemCellId";
ItemTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier forIndexPath:indexPath];
cell.item.text = _items[indexPath.row];
cell.ratingView.value = ((NSNumber *)_ratings[indexPath.row]).floatValue;
[cell bringSubviewToFront:cell.ratingView];
[cell.ratingView addTarget:self action:@selector(updateRating:) forControlEvents:UIControlEventValueChanged];
[cell layoutSubviews];
return cell;
}
- (void)updateRating:(HCSStarRatingView *)ratingView {
long indexOfRatingView = [self.tableView indexPathForCell:(ItemTableViewCell *)[[ratingView superview] superview]].row;
[_ratings replaceObjectAtIndex:indexOfRatingView withObject:[[NSNumber alloc] initWithFloat:ratingView.value]];
[self.tableView reloadRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:indexOfRatingView inSection:0]] withRowAnimation:UITableViewRowAnimationNone];
}
- (void)loadRatings {
_ratings = nil;
_ratings = [[NSMutableArray alloc] init];
for (int i = 0; i < _items.count; i++) {
[_ratings addObject:[[NSNumber alloc] initWithFloat:1.0]];
}
}
}
我没有在ItemTableViewCell
代码上添加任何内容。这是:
@implementation ItemTableViewCell
- (void)awakeFromNib {
// Initialization code
}
- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
[super setSelected:selected animated:animated];
// Configure the view for the selected state
}
我是iOS应用开发的新手,希望你能提供帮助。
感谢。
答案 0 :(得分:1)
我们过去解决问题的所有努力似乎都更侧重于加载单元格,而不是UITableViewCell
本身。
我发现问题在于我对标签的限制和星级评定。我刚刚为我的星级添加了height
约束,当tableView出现时它变得可见。我还需要将[self.tableView reloadData];
放在我的viewDidAppear
方法上。
但是,UITableViewCell
最初会以固定高度显示,然后在向用户显示视图后调整其高度,这可能对用户没有吸引力。当我点击星级时,tableView会滚动。
但无论如何,这给了我解决问题的希望。
我发现它很奇怪。因为,如果它是约束或布局错误,为什么它在iOS 9上工作正常而不在iOS 8上工作?
非常感谢。
答案 1 :(得分:0)
尝试在tableViewCell.m文件的awakefromnib方法中添加此代码(在导入 HCSStarRatingView 之后)。还可以在模拟器中尝试调试模式,以便在第一次触摸之前查看视图是否存在。 / p>
HCSStarRatingView *starRatingView = [[HCSStarRatingView alloc] initWithFrame:initWithFrame:CGRectMake(0, 0, self.ratingView.frame.size.width, self.ratingView.frame.size.height)];
答案 2 :(得分:0)
我猜有可能是带来子视图的问题。
请在单元格中尝试使用索引路径方法行。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *identifier = @"itemCellId";
ItemTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier forIndexPath:indexPath];
cell.item.text = _items[indexPath.row];
cell.ratingView.value = ((NSNumber *)_ratings[indexPath.row]).floatValue;
//[cell bringSubviewToFront:cell.ratingView];
[cell.ratingView addTarget:self action:@selector(updateRating:) forControlEvents:UIControlEventValueChanged];
[cell layoutSubviews];
return cell;
}
如果它仍然不在视图中,则加载添加此代码并再次测试。
- (void)viewDidLoad
{
[super viewDidLoad];
self.tableView.estimatedRowHeight = 140.0;
self.tableView.rowHeight = UITableViewAutomaticDimension;
_allItems = [[NSDictionary alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"AssessmentItems" ofType:@"plist"]];
_items = nil;
_items = [_allItems objectForKey:_currentEval];
[self.tableView reloadData];
[self loadRatings];
}
希望这能解决您的问题。
答案 3 :(得分:0)
调用[self loadRatings];
后,您需要重新加载表格数据。