簡體   English   中英

iOS Swift-加載自定義表格單元格

[英]iOS Swift - Loading custom table cells

在單個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
    }

}

這可能更有效,但是您只是放棄了擁有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
}

並且當段控件更改時,重新加載數據源

如果可能的話,只需使用NSFetchedResultsController在UITableView部分中分割動物即可。

看一下這個問題:快速使用NSFetchedResultsController創建節

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM