测试UITableView的章节页脚

时间:2015-04-29 02:45:45

标签: ios objective-c uitableview

尝试在UITableView中测试UITegmentedControl,UITableView是在UITableViewDelegate方法中创建的:

-(UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section {
    if (section == 0) {
        UIView *container = [[UIView alloc]initWithFrame:CGRectMake(0, 0, tableView.frame.size.width, [self tableView:tableView heightForFooterInSection:section])];
        [self.segmentedControl setCenter:container.center];
        [container addSubview:self.segmentedControl];
        return container;
    } else {
        return [super tableView:tableView viewForFooterInSection:section];
    }
}

在测试课程中:

-(void)testSegmentedControl {
    MyTableViewController *viewController = [[MyTableViewController alloc]initWithNibName:@"MyTableViewController" bundle:nil];
    [viewController.tableView reloadData];

    // Getting the footer via the delegate is cheating IMO.
    UITableViewHeaderFooterView *footer =  [viewController.tableView footerViewForSection:0];
    UISegmentedControl *segmentControl = footer.subviews[0];
    // do stuff to the segmentControl then check the tableView.
    [viewController.tableView reloadData];
}

我目前通过全局属性(UISegmentedControl)操纵viewController.segmentedControl,然后调用[viewController.tableView reloadData]来更新UITableViewCell的状态。但在我看来,从[viewController.tableView footerViewForSection:0]获取页脚是正确的测试方法。任何指导都表示赞赏。

修改

正如约翰罗杰斯所建议的那样,我已经尝试将UITableViewHeaderFooterView像我们在cellForRowAtIndexPath:

中那样出列
-(UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section {
    if (section == 0) {
        UITableViewHeaderFooterView *footer = [tableView dequeueReusableHeaderFooterViewWithIdentifier:self.footerReuseId];
        if (footer == nil) {
            footer = [[UITableViewHeaderFooterView alloc]initWithReuseIdentifier:self.footerReuseId];
        }
        if (![footer.subviews containsObject:self.segmentedControl]) {
            [footer addSubview:self.segmentedControl];
        }
        return footer;
    } else {
        return [super tableView:tableView viewForFooterInSection:section];
    }
}

测试方法没有改进:

-(void)testSegmentedControl {
    MyTableViewController *viewController = [[MyTableViewController alloc]initWithNibName:@"MyTableViewController" bundle:nil];
    [viewController.tableView reloadData];
    UITableViewHeaderFooterView *footer1 = (UITableViewHeaderFooterView *)[viewController.tableView dequeueReusableHeaderFooterViewWithIdentifier:viewController.footerReuseId];
    UITableViewHeaderFooterView *footer2 = [viewController.tableView footerViewForSection:0];
    // Break point shows that footer1 and footer2 are nil.
}

1 个答案:

答案 0 :(得分:0)

您遇到的问题是footerViewForSection实际上是一个UITableView方法,它使用该方法为该部分提供视图。

您必须将可重复使用的UITableViewHeaderFooterView出列,以便在测试类中对其进行测试:

UITableViewHeaderFooterView *footer = [tableView dequeueReusableHeaderFooterViewWithIdentifier:mySectionFooterViewIdentifier];

这正是您在为表格视图提供的footerViewForSection 方法中应该使用的内容,而您只是在测试类中将其排队。

希望这有帮助!

~J