我的课程设置如下:
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;我失踪了?
答案 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
}
}
这是一个非常简单的例子,所以应该很容易看到发生了什么。
如果您已经(我的假设,复杂)设置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(它的超级视图)的顶部,底部,前导和尾随约束。