默认情况下,当我在 IB 中拖出 TableViewController 时,tableview 占据了所有屏幕,即使用户滚动 tableview 也无法添加保持原位的 UIView(如果我说添加带有一些按钮的 UIView,那么当我滚动 UIView 也会滚动的 tableview 时。)
我的程序使用 UITableViewController 子类来控制 tableview,让顶部栏保持静态即使用户滚动的最简单方法是什么?
默认情况下,当我在 IB 中拖出 TableViewController 时,tableview 占据了所有屏幕,即使用户滚动 tableview 也无法添加保持原位的 UIView(如果我说添加带有一些按钮的 UIView,那么当我滚动 UIView 也会滚动的 tableview 时。)
我的程序使用 UITableViewController 子类来控制 tableview,让顶部栏保持静态即使用户滚动的最简单方法是什么?
简单,而不是使用 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];
}
我推荐的方法(我认为这是 Apple 鼓励的设计模式)是使用嵌入 segue 将您的表视图控制器插入到包含您的附加视图的父控制器中。这有助于保持模块化,并有助于使整个应用程序结构易于理解。
基本步骤如下:
prepareForSegue
方法中,检查嵌入 segue 的标识符并进行任何其他接线。视图控制器和视图关系是自动建立的,但您可能需要配置表视图控制器并保留对它的引用。以编程方式,使用 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
}
}