如何使用自动布局垂直堆叠表视图?

时间:2015-05-21 01:38:09

标签: ios uitableview autolayout

是否有一种简单的方法来堆叠多个表视图,一个在另一个之上?我的情况是我有3个表视图:

  • 第一个包含一组数据输入的文本字段
  • 第二个包含零个或多个类型A的记录。用户可以原位添加和删除这些记录
  • 第三个包含零个或多个B类记录。用户可以原位添加和删除这些记录

当添加了足够类型A或B的记录时,我希望整个视图根据需要滚动,就像它是一个表视图一样。

我想要的结果与编辑联系人屏幕非常相似:

enter image description here

顶部(First,Last,Company)相当于我的第一张桌子。电话号码部分相当于我的第二部分,电子邮件部分相当于我的第三部分。

我不知道联系人屏幕是否实际使用多个表。我知道,如果我可以将我的功能分解为单独的表而不是试图将它们全部合并为一个,那么它将使我的生活变得更加容易。

我尝试过的方法是:

  • 定义了我自己的父控制器,它继承自UIViewController
  • 此父控制器实例化三个子控制器并将它们添加到控制器层次结构
  • 所有三个子控制器(所有UITableViewController实例)禁用滚动
  • 使用布局约束
  • 将所有三个子控制器的视图排列在包含UIView的视图中
  • 包含UIView已添加到UIScrollView
  • UIScrollView是我控制者的唯一子女

这导致没有显示任何内容。我唠叨了一下,发现为我的孩子视图手动指定框架使它们可见,但我无法与他们的内容互动。

所以,我的问题是:如何在利用自动布局的同时垂直堆叠多个表视图?

1 个答案:

答案 0 :(得分:1)

可以这样做,但除非我遗漏某些东西,否则根本不需要它。我将采用的方法只是一个包含多个原型单元的表视图,其中您的代码将每个“表视图”定义为您的案例中的一个部分,您只需选择适当的原型单元格。当然,这些单元格中的每一个都可以拥有自己的类,因此在定制方面几乎无限。我很肯定这就是Apple在你展示的联系人应用程序中所做的事情。

这是我一直采用的方法,我认为没有理由说它不适合你。附件是基本概念的屏幕截图。每个单元格都有唯一的类和标识符。

Multiple prototype cells

然后你在代码中做了类似的事情(不是很明显,这只是我代码中的一个例子)。你会看到,对于我检查的每个条件,我选择一个不同的单元类并根据需要进行自定义:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = NULL;

    BOOL searchDisplayControllerIsActive = _searchController.isActive;

    if (searchDisplayControllerIsActive) {
        if ([_searchResults count] == 0) {
            if (self.activeConnection != nil) {
                SearchingTableViewCell *searchCell = [self.tableView dequeueReusableCellWithIdentifier:@"SearchingCell" forIndexPath:indexPath];
                [searchCell.activityView startAnimating];

                cell = searchCell;
            }
            else {
                cell = [self.tableView dequeueReusableCellWithIdentifier:@"NoResultsCell" forIndexPath:indexPath];
            }
        }
        else {
            SearchResultTableViewCell *thisCell = [tableView dequeueReusableCellWithIdentifier:@"SearchResultCell" forIndexPath:indexPath];

            Movie *thisMovie = [self.searchResults objectAtIndex:indexPath.row];

            [thisCell.posterImage sd_setImageWithURL:[NSURL URLWithString:thisMovie.imdbBigPosterURL] placeholderImage:[UIImage imageNamed:@"SmallMovieReel"]];
            thisCell.titleLabel.text = thisMovie.title;

            if (thisMovie.in_wanted) {
                thisCell.wantedImage.alpha = 1.0;
            }
            else {
                thisCell.wantedImage.alpha = 0.1;
            }

            if (thisMovie.in_library) {
                thisCell.manageImage.alpha = 1.0;
            }
            else {
                thisCell.manageImage.alpha = 0.1;
            }

            NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
            [dateFormatter setDateFormat:@"yyyy"];
            thisCell.yearLabel.text = [dateFormatter stringFromDate:thisMovie.releaseDate];

            cell = thisCell;
        }
    }
    return cell;
}