5

默认情况下,当我在 IB 中拖出 TableViewController 时,tableview 占据了所有屏幕,即使用户滚动 tableview 也无法添加保持原位的 UIView(如果我说添加带有一些按钮的 UIView,那么当我滚动 UIView 也会滚动的 tableview 时。)

我的程序使用 UITableViewController 子类来控制 tableview,让顶部栏保持静态即使用户滚动的最简单方法是什么?

4

3 回答 3

5

简单,而不是使用 UITableViewController 只需使用 UIViewController 并在其中放置 UITableView。(为您在表格上方或下方添加辅助视图留出空间)这样,您可以让视图控制器的视图占据整个屏幕,并在其中手动定义表格视图的框架。需要进行一些重新排列,但会满足您的需要。

在此处输入图像描述

您需要注意的唯一真正区别是您需要使您的视图控制器同时符合 UITableViewDelegate 和 UITableViewDatasource 协议,以及自己声明表视图的出口。

@property (weak,nonatomic) IBOutlet UITableView *tableView;

同样重要的是要记住,有一些功能仅在 UITableViewController 上可用clearsSelectionOnViewWillAppear,但您始终可以自己复制它们。

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    [self.tableView deselectRowAtIndexPath:self.tableView.indexPathsForSelectedRows animated:YES];
}
于 2013-08-27T18:26:24.907 回答
4

我推荐的方法(我认为这是 Apple 鼓励的设计模式)是使用嵌入 segue 将您的表视图控制器插入到包含您的附加视图的父控制器中。这有助于保持模块化,并有助于使整个应用程序结构易于理解。

基本步骤如下:

  1. 在 IB 中创建父视图控制器并添加容器视图
  2. 通过从容器视图 ctrl 拖动到要嵌入的视图控制器来创建一个嵌入 segue。
  3. 给 segue 一个标识符,如“EmbedMyTable”。
  4. 在父控制器的prepareForSegue方法中,检查嵌入 segue 的标识符并进行任何其他接线。视图控制器和视图关系是自动建立的,但您可能需要配置表视图控制器并保留对它的引用。
于 2013-08-27T18:26:11.087 回答
1

以编程方式,使用 Swift 约束。在我看来,这个解决方案更干净:

    import UIKit

    class SettingsController : UIViewController, UITableViewDelegate, UITableViewDataSource {

    let tableView : UITableView = {
        let t = UITableView()
        t.translatesAutoresizingMaskIntoConstraints = false
        return t
    }()

    override func viewDidLoad() {
        super.viewDidLoad()

        // set a background color so we can easily see the table
        self.view.backgroundColor = UIColor.blue

        // add the table view to self.view
        self.view.addSubview(tableView)

        // constrain the table view to 120-pts on the top,
        //  32-pts on left, right and bottom (just to demonstrate size/position)

        tableView.leftAnchor.constraint(equalTo: view.leftAnchor, constant: 32.0).isActive = true
        tableView.topAnchor.constraint(equalTo: view.topAnchor, constant: 120.0).isActive = true
        tableView.rightAnchor.constraint(equalTo: view.rightAnchor, constant: -32.0).isActive = true
        tableView.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -32.0).isActive = true

        // set delegate and datasource
        tableView.delegate = self
        tableView.dataSource = self

        // register a defalut cell
        tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
    }

    // Note: because this is NOT a subclassed UITableViewController, 
    // DataSource and Delegate functions are NOT overridden

    // MARK: - Table view data source

    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 25
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)

        cell.textLabel?.text = "\(indexPath)"

        return cell
    }

    // MARK: - Table view delegate

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        // etc
    }
}
于 2018-10-16T17:54:47.667 回答