UITableView单元格内容在iOS 9上加载,但在iOS 8上没有

时间:2015-10-23 06:07:18

标签: ios objective-c uitableview

我遇到过这样的事件,其中UITableView单元格内容在iOS 9上正常加载,但在iOS 8上没有加载。我已在模拟器和设备上验证了这一点。

我已尝试在viewDidLoadviewWillAppear甚至viewDidAppear上加载数据,但仍然相同。我已尝试dispatch_async重新加载tableView但仍然相同。

检查下面的图片,看看我遇到的问题。

iOS 9 iOS 8

然而,当我点击星星的位置时,突然出现UIView星星。

iOS8 2

以下是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应用开发的新手,希望你能提供帮助。

感谢。

4 个答案:

答案 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];后,您需要重新加载表格数据。