我需要使用我的表视图创建一个向下钻取效果,这将为我的主表视图中的每个原始单元格扩展四个深度表视图。到目前为止,我已成功填充主视图,并使用此面向对象方法相应地进行第二个表视图,这是我的主表视图中的代码:
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提供自己的属性吗?或者有没有办法可以扩展我已经完成的工作?一种更有效的方式?
答案 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个查看不同方式的视图,则可以使用两个视图控制器)。
(我不喜欢根据行索引制作内容。如果你想以不同的方式排列行列,那就太难了。)