我想显示一个具有分段控件的用户界面,并且为分段控件的每个部分提供了不同的表视图;因此,可以在两者之间切换的2个桌子视图(伙伴和束)。为了实现这一点,我完成了以下
- 在故事板上创建一个ViewController
- 从ViewController删除视图
- 使用关联的XIB文件创建一个新的UiviewController Swift类
- 将分段的控件放在xib 中的主Uiview中
- 将一个内部Uiview元素放在主Uiview的内部,以获取表替换的空间
- 创建了UaiteView和相应XIB文件的两个子类
我想到的一些选项:
- 我可以将接口构建器中的内部Uiview的类设置为一个表视图之一,但是我不知道如何实例化另一个视图。如果我创建了重叠的内部Uiviews,每个Uiviews都与表视图关联并在切换分段控件时隐藏其中的一个,那实际上是有效的,但是视图的重叠性质使布局变得困难且不直觉。
- 我想知道如何做:实例化表代替单个主Uiview元素
- 替代方案:具有一个基于其显示的数据的分段控制状态的条件,该子类具有一个条件。我不太喜欢这样,因为它会将代码与表视图混合在一起。在这种情况下,我什至不需要再使用XIB,只需一个桌子视图就可以在故事板上做到这一点。
** ViewController代码**
@objc(BuddiesBunchesViewController) class BuddiesBunchesViewController: UIViewController {
@IBOutlet weak var segmentedControl: UISegmentedControl!
@IBOutlet weak var tableView: UIView!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
// Instantiate tableView here to BuddiesTableView
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
@IBAction func segmentedControlIndexChanged(sender: AnyObject) {
switch segmentedControl.selectedSegmentIndex {
case 0: // Buddies
// Set tableview to the buddies table view
case 1: // Bunches
// Set tableview to the buddies table view
default:
break;
}
}
}
**表查看**
@IBDesignable class BuddiesTableView: UITableView, UITableViewDataSource, UITableViewDelegate {
var view: UIView!
var nibName: String = "BuddiesTableView"
//init
override init(frame: CGRect) {
// set properties
super.init(frame: frame)
// Set anything that uses the view or visible bounds
setup()
}
required init(coder aDecoder: NSCoder) {
//set properties
super.init(coder: aDecoder)
// Setup
setup()
}
func setup() {
view = loadViewFromNib()
view.frame = self.bounds
view.autoresizingMask = UIViewAutoresizing.FlexibleWidth | UIViewAutoresizing.FlexibleHeight
addSubview(view)
}
func loadViewFromNib() -> UIView {
let bundle = NSBundle(forClass: self.dynamicType)
let nib = UINib(nibName: nibName, bundle: bundle)
let view = nib.instantiateWithOwner(self, options: nil)[0] as! UIView
return view
}
// MARK: - Table View
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 10
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "MyTestCell")
cell.textLabel?.text = "(indexPath.row)"
return cell
}
}
我个人不会创建两个表视图并将它们交换。两者之间唯一的重要区别是它们是不同的实例,您可以在数据源代码中对其进行测试。他们会指出不同的数据源吗?为什么不只是在即时更改数据源,而不是表视图呢?
创建一个表观。创建两个(或更多)类,以充当数据源(甚至可能是代表)。如果有任何共同的行为,它们可能基于共同的超类。
当分段的控制值更改时,只需更改表视图的数据源属性,以指向该状态的代码的类。如果更改数据源不会自动重新加载,则可能需要使用-reloaddata调用来遵循。
@IBOutlet private weak var tableView: UITableView!
let moviesDataSource = MyMoviesDataSource()
let tvShowsDataSource = MyTVShowsDataSource()
@IBAction func segmentedControlTouched(sender: UISegmentedControl) {
switch sender.selectedSegmentIndex {
case 0:
self.tableView.dataSource = self.moviesDataSource
self.tableView.delegate = self.moviesDataSource
case 1:
self.tableView.dataSource = self.tvShowsDataSource
self.tableView.delegate = self.tvShowsDataSource
}
self.tableView.reloadData()
}
我的解决方案将如下。
您有一个段控件,有两个段,因此,您只能拥有一个UITableView
对象,而不是具有两个表视图,并基于段控制selectedSegmentIndex
数字更改数据源,然后重新加载表视图。在故事板中,将表视图放在UIVIewController
的顶部,并为此创建@IBOutlet
。