默认情况下,当我在IB中拖出一个TableViewController时,tableview会占用所有屏幕,即使用户滚动tableview,也无法添加一个保持原样的UIView(如果我说添加一个UIView的话)按钮,然后当我滚动桌面视图时,UIView也会滚动。)
我的程序使用UITableViewController子类来控制tableview,即使用户滚动,顶部栏保持静态的最简单方法是什么?
答案 0 :(得分:5)
简单,而不是使用UITableViewController只是使用UIViewController,其中放置了UITableView。 (留出空间让您在表格上方或下方添加辅助视图)这样,您可以让视图控制器的视图占据整个屏幕,并手动定义其中的表格视图的框架。将需要一些重新安排,但将满足您的需求。
您需要注意的唯一真正的区别是,您需要使视图控制器符合UITableViewDelegate和UITableViewDatasource协议,以及自己声明表视图的出口。
@property (weak,nonatomic) IBOutlet UITableView *tableView;
同样重要的是要记住,有些函数只能在像clearsSelectionOnViewWillAppear
这样的UITableViewController上使用,但你总是可以自己复制它们。
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[self.tableView deselectRowAtIndexPath:self.tableView.indexPathsForSelectedRows animated:YES];
}
答案 1 :(得分:3)
我推荐的方法(我认为这是Apple鼓励的设计模式)是使用embed segue将表视图控制器插入包含其他视图的父控制器。这有助于保持模块化,并有助于使整个应用程序结构易于理解。
基本步骤如下:
prepareForSegue
方法中,检查嵌入segue的标识符并进行任何其他连接。视图控制器和视图关系是自动建立的,但您可能需要配置表视图控制器并保留对它的引用。答案 2 :(得分: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
}
}