switch 语句的替代方法,向下钻取 Table 视图?
Alternative for switch statement, drill down Table Views?
我需要使用我的 table 视图创建向下钻取效果,这将为我的主 table 视图中的每个原始单元格深入展开四个 table 视图。到目前为止,我已经成功填充主视图,第二个 table 视图相应地使用这种面向对象的方法,这是我的主 table 视图中的代码:
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"]
}
这是我的第二个 table 视图控制器中的代码:
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
现在如您所见,我能够通过创建自定义 class、创建该 class 的自定义对象并使用 [=30= 中的属性来填充前两个视图].现在我的困境是,每个 "sportCategories" 属性都有自己的 table 视图可以扩展到其中,其中将包含相应运动中运动员姓名的完整列表。现在我应该用什么方法来做这件事?我应该在我的第二个 table 视图控制器中创建一个全新的 class 来为 sportsCategories 提供它们自己的属性吗?或者有什么方法可以扩展我已经完成的工作?更有效的方法?
如果层次结构只是从主视图控制器到 21 个特定视图控制器之一再返回(而不是 21 个嵌套视图控制器),并且所有这 21 个表的行为都非常相似,那么真的没有有很多理由拥有 21 个视图控制器。为所有 21 个显示器设置一个视图控制器,然后在切换到它之前告诉它要显示哪些数据,当然它必须能够显示所有 21 个视图的数据。 (如果您有 15 个视图以一种方式查看,6 个视图以不同方式查看,您将使用两个视图控制器)。
(我不喜欢根据行索引来做事情。如果你想以不同的方式排列行,那只会让事情变得非常困难)。
如果你只有一个细节控制器,你根本不需要switch语句。执行此操作的最佳(最 object 方向)方法是使用自定义 object 来填充您的单元格。您可以创建一个 Sport
object,它有两个属性,name (NSString)
和 categories (NSArray)
。在主 table 视图控制器中,您将创建所有 Sport
object,并将它们添加到数组 sports
中。您将使用 sports
来填充数组,
let aSport = sports[indexPath.row] as! Sport
cell.textLabel.text = aSport.name
在 didSelectRowAtIndexPath
中,您创建 DetailViewController
的实例,在 class 中设置 属性 的值(我们称之为 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
填充 table 视图。由于您可以访问整个 Sport
object,您可以使用 selectedSport.name
为控制器提供标题。
我需要使用我的 table 视图创建向下钻取效果,这将为我的主 table 视图中的每个原始单元格深入展开四个 table 视图。到目前为止,我已经成功填充主视图,第二个 table 视图相应地使用这种面向对象的方法,这是我的主 table 视图中的代码:
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"]
}
这是我的第二个 table 视图控制器中的代码:
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
现在如您所见,我能够通过创建自定义 class、创建该 class 的自定义对象并使用 [=30= 中的属性来填充前两个视图].现在我的困境是,每个 "sportCategories" 属性都有自己的 table 视图可以扩展到其中,其中将包含相应运动中运动员姓名的完整列表。现在我应该用什么方法来做这件事?我应该在我的第二个 table 视图控制器中创建一个全新的 class 来为 sportsCategories 提供它们自己的属性吗?或者有什么方法可以扩展我已经完成的工作?更有效的方法?
如果层次结构只是从主视图控制器到 21 个特定视图控制器之一再返回(而不是 21 个嵌套视图控制器),并且所有这 21 个表的行为都非常相似,那么真的没有有很多理由拥有 21 个视图控制器。为所有 21 个显示器设置一个视图控制器,然后在切换到它之前告诉它要显示哪些数据,当然它必须能够显示所有 21 个视图的数据。 (如果您有 15 个视图以一种方式查看,6 个视图以不同方式查看,您将使用两个视图控制器)。
(我不喜欢根据行索引来做事情。如果你想以不同的方式排列行,那只会让事情变得非常困难)。
如果你只有一个细节控制器,你根本不需要switch语句。执行此操作的最佳(最 object 方向)方法是使用自定义 object 来填充您的单元格。您可以创建一个 Sport
object,它有两个属性,name (NSString)
和 categories (NSArray)
。在主 table 视图控制器中,您将创建所有 Sport
object,并将它们添加到数组 sports
中。您将使用 sports
来填充数组,
let aSport = sports[indexPath.row] as! Sport
cell.textLabel.text = aSport.name
在 didSelectRowAtIndexPath
中,您创建 DetailViewController
的实例,在 class 中设置 属性 的值(我们称之为 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
填充 table 视图。由于您可以访问整个 Sport
object,您可以使用 selectedSport.name
为控制器提供标题。