根据indexPath.row更改didSelectRowAtIndexPath操作的最佳方法是什么。
例如,5行让我有这样的事情:
switch indexPath.row {
case 0:
if offlineMode {
// do this
} else {
// do something else
}
case 1:
if offlineMode {
// do this
} else {
// do something else
}
case 2:
if offlineMode {
// do this
} else {
// do something else
}
case 3:
if offlineMode {
// do this
} else {
// do something else
}
case 4:
if offlineMode {
// do this
} else {
// do something else
}
default:
// default behaviour
}
所以,我可以将这段代码分成doActionOnSelect(indexPath:NSIndexPath),这样它就不在didSelectRowAtIndexPath方法中。
但是,我可以在这里看到很多重复的代码。这就是我想要最小化的。
这个问题更多地围绕着MVC,责任以及从根本上构建我的代码的方式。
答案 0 :(得分:1)
这都是高水平和普遍的,但希望有帮助。
重构该代码的一种方法是将您的数据/状态(可能由该大型switch语句表示的内容)放入其他对象中,例如" model"并使用section / row输入询问该模型并返回预期的输出:也许是某种类型的单元格。或者可能是另一个专门用于您需要创建的单元格的模型对象。
另一个重构是使用enum
来定义您的"模式"并在switch语句中以及用于支持表视图节和行的数据中使用它。由于enum
在Swift中是详尽无遗的,因此您可以消除令人困惑的default:
案例。
另一种方法可以是通过模型对象表示每个单元的状态。将数据提供给模型对象,然后在创建时将模型对象传递给单元格。
无论如何,有很多方法可以给这只猫上皮:
https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=Refactor+table+view
答案 1 :(得分:1)
摆脱if / else语句的一种简单方法是创建一个实现switch案例的函数offlineDidSelectRowAtIndexPath。
以下是:
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
guard offlineMode != true else {
offlineDidSelectRowAtIndexPath(tableview, didSelectRowAtIndexPath: indexPath)
return
}
switch indexPath.row {
case 0:
// do something else 1
case 1:
// do something else 2
case 2:
// do something else 3
case 3:
// do something else 4
case 4:
// do something else 5
default:
// default online and/or offline behaviour
}
你将有一个功能
func offlineDidSelectRowAtIndexPath(tableView: UITableView, indexPath: NSIndexPath) {
switch indexPath.row {
case 0:
// do this 1
case 1:
// do this 2
case 2:
// do this 3
case 3:
// do this 4
case 4:
// do this 5
default:
// default behaviour
}
}
注意:可能比我的答案更简单/更容易/更好的方式。 (另外,不要忘记休息陈述)。