替换switch语句,深入了解表视图?

时间:2015-05-21 18:36:43

标签: ios uitableview swift xcode6 switch-statement

我需要使用我的表视图创建一个向下钻取效果,这将为我的主表视图中的每个原始单元格扩展四个深度表视图。到目前为止,我已成功填充主视图,并使用此面向对象方法相应地进行第二个表视图,这是我的主表视图中的代码:

 class FirstTableViewController: UITableViewController {


    let aSport:[Sport] = {
        var basketball = Sport()
        basketball.name = "Basketball"
        basketball.sportCategories = {
            var temp = ["International Basketball","Wheelchair Basketball","Beach Basketball","Deaf Basketball","Dwarf Basketball"]
            temp.sort(<)
            return temp
            }()

        var golf = Sport()
        golf.name = "Golf"
        golf.sportCategories = {
            var temp = ["Miniature Golf","Dart Golf","Sholf","Disc Golf","Footgolf"]
            temp.sort(<)
            return temp
            }()

        var football = Sport()
        football.name = "Football"
        football.sportCategories = {
            var temp = ["Flag Football","Indoor Football","Arena Football","Non-Tackle Football","Paper Football"]
            temp.sort(<)
            return temp
            }()

        var swimming = Sport()
        swimming.name = "Swimming"
        swimming.sportCategories = {
            var temp = ["Competitive Swimming","Synchronized Swimming","Duo Swimming","Relay Swimming"]
            temp.sort(<)
            return temp
            }()

        return  [basketball,golf,football,swimming]
        }()

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {

        return 1
    }

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        return aSport.count
    }

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
    {
        let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! UITableViewCell
        cell.textLabel?.text = aSport[indexPath.row].name
        return cell
    }

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        let cell = sender as! UITableViewCell
        let row = tableView.indexPathForCell(cell)?.row
        let detail = segue.destinationViewController as! SecondTableViewController
        detail.selectedSport = aSport[row!]
    }


}


class Sport {

    var name: String = "sport name"
    var sportCategories: NSArray = ["variations of selected sport"]
    var detailText: NSArray = ["little description of sport"]

}

这是我的第二个表视图控制器中的代码:

class SecondTableViewController: UITableViewController {

var selectedSport = Sport();


override func viewDidLoad() {
    super.viewDidLoad()
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()

}


override func numberOfSectionsInTableView(tableView: UITableView) -> Int {

    return 1
}

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    return selectedSport.sportCategories.count
}


override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("Custom", forIndexPath: indexPath) as! UITableViewCell
    cell.textLabel!.text = selectedSport.sportCategories[indexPath.row] as? String
    cell.detailTextLabel!.text = selectedSport.detailText[indexPath.row] as? String
    return cell
}

}

这是我的模拟器的截图,所以你得到一个视觉:

https://40.media.tumblr.com/6ee47f49c2b223b514f8067c68ac6af1/tumblr_nqbe74HYGo1tupbydo1_500.png

选择篮球时:

https://41.media.tumblr.com/ced0ee2ff111a557ec3c21f1fb765adf/tumblr_nqbe74HYGo1tupbydo2_500.png

现在您可以看到,我能够通过创建自定义类来填充前两个视图,创建该类的自定义对象并使用类中的属性。现在我的困境是,每个“sportCategories”属性都有自己的OWN表视图,这些视图将包含相应运动中的一系列玩家名称。我应该采取什么方法来做这件事?我应该在第二个表视图控制器中创建一个全新的类来为sportsCategories提供自己的属性吗?或者有没有办法可以扩展我已经完成的工作?一种更有效的方式?

2 个答案:

答案 0 :(得分:1)

如果您只有一个详细控制器,则根本不需要switch语句。最好(最面向对象)的方法是使用自定义对象来填充单元格。您可以创建一个Sport对象,该对象包含两个属性name (NSString)categories (NSArray)。在主表视图控制器中,您将创建所有Sport个对象,并将它们添加到数组sports。您可以使用sports填充数组,

let aSport = sports[indexPath.row] as! Sport
cell.textLabel.text = aSport.name

didSelectRowAtIndexPath中,您创建了DetailViewController的实例,设置该类中属性的值(让我们称之为selectedSport),然后推送它,

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

    let detailVC = DetailViewController()
    detailVC.selectedSport = sports[indexPath.row]
    navigationController?.pushViewController(detailVC, animated: true)
}

DetailViewController中,您可以使用selectedSport.categories填充表格视图。由于您可以访问整个Sport对象,因此可以使用selectedSport.name为控制器提供标题。

答案 1 :(得分:0)

如果层次结构只是从主视图控制器到21个特定视图控制器之一并且返回(不是21个嵌套视图控制器),并且所有这21个表的行为非常相似,那么实际上并非如此很多理由拥有21个视图控制器。对于所有21个显示器都有一个视图控制器,然后在切换到它之前,告诉它要显示什么数据,当然它必须能够显示所有21个视图的数据。 (如果您有15个查看单向视图和6个查看不同方式的视图,则可以使用两个视图控制器)。

(我不喜欢根据行索引制作内容。如果你想以不同的方式排列行列,那就太难了。)