ios - 如何使用自动布局垂直堆叠 TableView ?

标签 ios uitableview autolayout

有没有一种简单的方法来堆叠多个 TableView ,一个在另一个之上?我的场景是我有 3 个 TableView :

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

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

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

enter image description here

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

我不知道联系人屏幕是否实际上使用了多个表格。我确实知道,如果我可以将我的功能分解成单独的表而不是试图将它们集中到一个表中,那会让我的生活变得轻松得多。

我试过的方法是:

  • 定义了我自己的继承自UIViewController的父 Controller
  • 这个父 Controller 实例化三个子 Controller 并将它们添加到 Controller 层次结构中
  • 所有三个子 Controller (所有 UITableViewController 实例)都禁用滚动
  • 所有三个子 Controller 的 View 都使用布局约束安排在包含 UIView
  • 将包含的 UIView 添加到 UIScrollView
  • UIScrollView 是我的 Controller 的唯一 child

这导致什么都没有显示。我进行了一些修改,发现为我的 subview 手动指定框架使它们可见,但我无法与它们的内容进行交互。

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

最佳答案

可以这样做,但除非我遗漏了什么,否则真的没有必要这样做。我将采用的方法只是一个具有多个原型(prototype)单元格的 TableView ,其中您的代码将每个“ TableView ”定义为您案例中的一个部分,您只需选择适当的原型(prototype)单元格。当然,这些单元格中的每一个都可以有自己的类,因此您在定制方面几乎没有限制。我敢肯定,这就是 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;
}

关于ios - 如何使用自动布局垂直堆叠 TableView ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30363136/

相关文章:

ios - 如何在单个 tableView 中创建各种类型的单元格?

ios - 显示详细信息转场时未调用 Deinit

iOS - 细胞图像模糊

ios - 使用自动布局将 subview 添加到另一个 subview

ios8 - 是否可以强制 UIPopoverPresentationController 重新定位弹出框而不是调整其大小?

iphone - Objective-C : Is there a difference between these two statements?

iphone - 如何使用 NSCalendar 获取星期几?

ios - 使用 NSSet 关系填充 cellForRow

ios - 第一个单元格顶部的 tableHeaderView

ios - 自动布局和 UIScrollview 以及 subview Controller 问题