在单个UIViewController中显示多个表的最有效方法是什么?在任何给定时间只有一个可见,并且用户操纵segmentedControl来切换当前可见的内容。我能够使用3个tableViews完成它,但它似乎很乱。这是我的相关代码:
// Main UIViewController for handling 3 tableViews
class AnimalViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
let dogs = ["English Bulldog", "Labrador Retriever"]
let cats = ["Persian", "Siamese"]
let rabbits = ["Lionhead", "Rex"]
@IBOutlet weak var segmentedControl: UISegmentedControl!
@IBOutlet weak var dogsTableView: UITableView!
@IBOutlet weak var catsTableView: UITableView!
@IBOutlet weak var rabbitsTableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
self.dogsTableView.hidden = false
self.catsTableView.hidden = true
self.rabbitsTableView.hidden = true
}
@IBAction func indexChanged(sender: UISegmentedControl) {
switch sender.selectedSegmentIndex {
case 0:
self.dogsTableView.hidden = false
self.catsTableView.hidden = true
self.rabbitsTableView.hidden = true
case 1:
self.dogsTableView.hidden = true
self.catsTableView.hidden = false
self.rabbitsTableView.hidden = true
case 2:
self.dogsTableView.hidden = true
self.catsTableView.hidden = true
self.rabbitsTableView.hidden = false
default:
break;
}
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
var count: Int = 0
if (tableView == self.dogsTableView) {
println("dogs count")
count = self.dogs.count
}
else if (tableView == self.catsTableView) {
println("cats count")
count = self.cats.count
}
else if (tableView == self.rabbitsTableView) {
println("rabbits count")
count = self.rabbits.count
}
return count
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
var cell: UITableViewCell!
if (tableView == self.dogsTableView) {
println("dogs count")
var cell = self.dogsTableView.dequeueReusableCellWithIdentifier("cell") as? DogTableViewCell
if (cell == nil) {
let nib = NSBundle.mainBundle().loadNibNamed("DogTableViewCell", owner: DogTableViewCell.self, options: nil) as NSArray
cell = nib.objectAtIndex(0) as? DogTableViewCell
}
cell?.loadDog(breed: self.dogs[indexPath.row])
return cell!
}
else if (tableView == self.catsTableView) {
println("cats count")
var cell = self.catsTableView.dequeueReusableCellWithIdentifier("cell") as? CatTableViewCell
if (cell == nil) {
let nib = NSBundle.mainBundle().loadNibNamed("CatTableViewCell", owner: CatTableViewCell.self, options: nil) as NSArray
cell = nib.objectAtIndex(0) as? CatTableViewCell
}
cell?.loadCat(breed: self.cats[indexPath.row])
return cell!
}
else if (tableView == self.rabbitsTableView) {
println("rabbits count")
var cell = self.rabbitsTableView.dequeueReusableCellWithIdentifier("cell") as? RabbitTableViewCell
if (cell == nil) {
let nib = NSBundle.mainBundle().loadNibNamed("RabbitTableViewCell", owner: RabbitTableViewCell.self, options: nil) as NSArray
cell = nib.objectAtIndex(0) as? RabbitTableViewCell
}
cell?.loadRabbit(breed: self.rabbits[indexPath.row])
return cell!
}
else {
return cell!
}
}
}
// Dog, Cat, and Rabbit Table View Cell files (essentially the same, see Dog is shown below)
class DogTableViewCell: UITableViewCell {
@IBOutlet weak var titleLabel: UILabel!
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
override init(style: UITableViewCellStyle, reuseIdentifier: String!) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
}
func loadDog(#breed: String) {
self.titleLabel.text = breed
}
}
答案 0 :(得分:2)
这可能更有效,但您只是放弃了拥有3个表视图的想法。如何制作1个表视图并更改数据源,为选定的段进行切换。例如,在您的节数和节数以及cellForRowAtIndexPath方法的行数中:
switch segmentControl.selectedIndex {
case 0:
// data source for index 0
case 1:
// data source for index 1
case 2:
// data source for index 2
default:
break
}
当段控件更改时重新加载数据源
答案 1 :(得分:0)
如果可能,只需使用NSFetchedResultsController在UITableView部分中分割动物。
看看这个问题:Creating sections with NSFetchedResultsController, on the fly