iOS Swift - 加载自定义表格单元格

时间:2014-12-20 00:33:36

标签: ios uitableview swift

在单个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
    }

}

2 个答案:

答案 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