Xcode 9 - iOS 11 UITableView行为空

时间:2017-09-27 15:02:42

标签: objective-c xcode ios11

自从新的iOS 11更新以来,我有一个应用程序将在模拟器和设备上显示空白的tableview行。甚至行分隔符也不会显示应该存在的任何行。如果我将模拟器更改为较旧的iOS版本,行将显示正常。没有对代码或故事板的更改。

行仍然有数据,这意味着我可以点击其中一个空行,它将执行代码并包含我期望的信息。

看起来我在其中将tableview放在视图上的其他场景并且我没有使用内置文本标签工作正常。只是这个tableview类使用内置的文本标签。

这是tableview类的代码......

@interface BunkPickTableViewController ()

@end

@implementation BunkPickTableViewController

@synthesize appDelegate, delegate, bunkPassedValue;

- (void)viewDidLoad {

    [super viewDidLoad];

    UIView *backgroundView = [[UIView alloc] initWithFrame:self.view.bounds];

    appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];

    CAGradientLayer *bgLayer = [BackgroundLayer tanGradient];
    bgLayer.frame = self.view.bounds;
    [self.view.layer insertSublayer:bgLayer atIndex:0];

    self.tableView.backgroundView = backgroundView;

    [self.navigationController.navigationBar setTintColor:[UIColor blackColor]];

    self.title = @"Bunk Codes";

}

- (void)viewWillAppear:(BOOL)animated {

    [super viewWillAppear:animated];

    [[self navigationController] setNavigationBarHidden:NO animated:NO];

    [self.tableView reloadData];

}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}

#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return [appDelegate.bunkArray count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) {

        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

        cell.textLabel.textAlignment = NSTextAlignmentCenter;

        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;

        cell.backgroundColor = [UIColor clearColor];

    }

    Bunk *bunkObj = [appDelegate.bunkArray objectAtIndex:indexPath.row];

    cell.textLabel.text = bunkObj.bunkId;

    return cell;

}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    [tableView cellForRowAtIndexPath:indexPath].accessoryType = UITableViewCellAccessoryCheckmark;

    [self.tableView deselectRowAtIndexPath:indexPath animated:YES];

    Bunk *bunkObj  = [appDelegate.bunkArray objectAtIndex:indexPath.row];

    [delegate dismissBunkPop:bunkObj.bunkId];

    [self.navigationController popViewControllerAnimated:YES];

}

@end

TableView Settings Image

4 个答案:

答案 0 :(得分:3)

我也有这个问题,IOS 11显示空白单元格..但在IOS 10中很好。我的问题是我使用了一个梯度,无论出于什么原因,它都会阻止显示单元格文本。删除渐变解析了空白单元格。

答案 1 :(得分:3)

这可能是因为您的tableView位于bgLayer

之下

问题似乎出现在self.view.layer insertSublayer:bgLayer atIndex:0中。我在索引0处使用insertSubview并且我遇到了同样的问题。这可能是iOS 11中的一个错误 - 如果你的tableView是在storyboard中定义的,那么它总会被推迟。

最佳解决方案是将bgLayer放入tableView.backgroundView

注: 您也可以通过调用sendSubviewToBackbgLayer上的viewDidAppear来解决此问题,但不幸的是,tableview单元格正在移动到每个tableview reloaddata上,因此这不是一个好的解决方案。

答案 2 :(得分:0)

CAGradientLayer *gradient = [CAGradientLayer layer];
gradient.frame = self.tableView.bounds;
gradient.colors = @[(id)[UIColor blackColor].CGColor, (id)[UIColor 
                    grayColor].CGColor, (id)[UIColor 
                    lightGrayColor].CGColor];

UIView *bgView = [[UIView alloc] 
                          initWithFrame:self.tableView.bounds];
[self setBackgroundView:bgView];
[bgView.layer insertSublayer:gradient atIndex:0];

[self.tableView setBackgroundView:bgView];

为tableview的背景视图设置渐变图层为我解决了这个问题。在iOS 10中,我们可以直接将子图层插入tableView,但在iOS 11图层中只能插入到UITableVIew的背景视图中。

答案 3 :(得分:0)

与上述tableview子视图操作相结合,如果您的项目存在于Xcode 9之前,然后您在故事板上选中了使用安全区域布局指南,则也会出现此问题。尝试取消选中它,看看它是否有效。