如何将程序性约束添加到UITableView?

时间:2017-07-25 19:10:55

标签: ios swift uitableview constraints

我的课程设置如下:

class SettingsController: UITableViewController {

我希望能够为UITableView添加约束,以便在表的两侧有相等的间距(它当前是一个全宽度的表,所以在iPad上有点难看。)

我已经读过,我无法向UITableViewController添加约束,而是我必须向我的班级添加UIViewController,向其添加UITableView,然后我应该能够将约束添加到TableView。

我修改了课程并在下一行定义了UITableView。所以这是我现在的前两行:

class SettingsController: UIViewController {
  var tableView = UITableView()

再往下,我有这个代码将TableView附加到UIView

override func viewDidLoad() {
    super.viewDidLoad()   
    self.view.addSubview(tableView)
}

该应用程序已成功构建,但在尝试访问此视图时,屏幕显示为空白,因此我还无法尝试约束部分(如果我还原了我的内容,屏幕会正确显示数据; ve描述)。

我在这个类中的许多现有函数引用tableView来传递数据/设置行数等,但似乎我没有做正确的事情...是否有一块我和#39;我失踪了?

3 个答案:

答案 0 :(得分:6)

这是一个简单的示例,以编程方式创建表格视图并将其添加到" normal"视图:

//
//  SettingsController.swift
//
//  Created by Don Mag on 7/25/17.
//

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
    }

}

enter image description here 这是一个非常简单的例子,所以应该很容易看到发生了什么。

如果您已经(我的假设,复杂)设置UITableViewController课程正常工作,则应该非常直接地遵循此框架并将您的转换为UIViewController + { {1}}。

或者,您可以将现有的UITableView-as-subview作为子视图控制器加载,并将其视图(tableview)添加为子视图。

答案 1 :(得分:3)

所以,看起来你需要备份一个步骤而不是试图以某种方式在TableViewController中嵌入一个UIViewController。你提到的建议意味着你的SettingsController应该是UIViewController的子类,你应该为它添加一个UITableView。

向UITableView添加约束会比尝试使用UITableViewController更好。

修改

在获得任何数据之前,您应该能够实现约束。您只会看到一个空表视图,但它仍会显示行。如果你能看到你正在处理的东西,有时候玩约束会更容易。创建tableView时,可以使用以下命令:     var tableView = UITableView(frame: self.view) 至少可以帮助你获得成功。

因此,在实现了所需的约束之后,看起来您将缺少的是设置tableView的委托和dataSource并扩展视图控制器以实现这些方法。然后你应该有数据,你可以沉浸在你辛勤工作的荣耀中。

答案 2 :(得分:1)

我只是展示了添加约束的另一种方式。

首先,您需要设置view.translatesAutoresizingMaskIntoConstraints = false并执行以下操作

// align tableView from the left and right
self.view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-8-[view]-8-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["view": tableView]))

// align tableView from the top and bottom
self.view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-8-[view]-8-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["view": tableView]))

它将为表格视图提供关于self.view(它的超级视图)的顶部,底部,前导和尾随约束。