switch语句的替代方案,向下钻取表视图



我需要用我的表视图创建一个向下钻取效果,它将为我的主表视图中的每个原始单元格展开四个表视图。到目前为止,我已经成功地用这个面向对象的方法填充了主表视图和第二个表视图,下面是我的主表视图中的代码:

 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"属性都有自己的表视图,可以扩展到包含各自运动中球员姓名的完整列表。我应该用什么方法呢?我应该创建一个全新的类在我的第二个表视图控制器给体育类别自己的属性?或者有没有一种方法可以把我已经做过的功展开?一种更有效的方法?

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

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

didSelectRowAtIndexPath中,您创建了DetailViewController的实例,在该类中设置了一个属性的值(我们称之为selectedSport),并push了它,

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为控制器提供标题。

如果层次结构只是从主视图控制器到21个特定视图控制器中的一个并返回(不是21个嵌套视图控制器),并且所有这21个表的行为非常相似,那么就没有太多理由拥有21个视图控制器。所有21个显示都有一个视图控制器,然后在切换到它之前你告诉它要显示什么数据,当然它必须能够显示所有21个视图的数据。(如果你有15个视图朝一个方向看,6个视图朝另一个方向看,你会使用两个视图控制器)。

(我不喜欢制作依赖于行索引的东西。如果你想以另一种方式排列这些行,这就变得非常困难了。

最新更新