我有很多对象,我需要使用其中一个,具体取决于用户按下什么来填充我的表视图。为了减少if语句的使用我认为可能在字符串变量上存储所需对象的名称会有所帮助。当需要填充表视图时,将使用字符串变量而不是检查被认可对象名称。
// objects defined here from different classes.
var currentSection : String
@IBAction func button(_ sender: UIButton) {
if sender.tag == 1 { //
currentSection = "object1"
}
else if sender.tag == 2 { //
currentSection = "object2"
}
.........etc
}
public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
{
return(currentSection.item.count)
}
这就是我所做的但它不起作用,错误:“类型'String'的值没有成员'item'”
有人请告诉我如何告诉编译器使用字符串'value作为对象名吗?
答案 0 :(得分:1)
由于currentSection
是一个字符串,因此它对对象一无所知,因此currentSection.item
毫无意义。相反,您可以使用dictionary将字符串键与值相关联,以表示您所在部分中的数据。
struct RowItem {} // the thing that represents the text for your table view row
class MyViewController {
var sectionData: [String: [RowItem]] = [:] // a dictionary that associates string keys to arrays of RowItem
var currentSection: String = ""
func tableView(_ tableView, numberOfRowsInSection section: Int) -> Int {
let thisSection = sectionData[currentSection] ?? [] // you might not have data in the dictionary for currentSection
return thisSection.count
}
}
用于支持表格视图单元格的类型是什么?在cellForRow
中,您必须使用一些文本,图像等配置单元格 - 无论您使用的对象的类型是什么(我上面使用RowItem
)都应该是你的字典 - [String: [MyRowTypeWhateverThatIs]]
。因此,每个字符串键映射到值,这是数据数组。此数组中的项目将对应于表格视图中的单元格。
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let dataForKey: [RowItemOrWhatever] = sectionData[currentSection] ?? [] // this array contains items that correspond 1:1 to the cells in your table view
if indexPath.row >= dataForKey.count { return UITableViewCell() } // it's possible that this index could be outside the bounds of dataForKey, so we need to handle that case sensibly
let cell = tableView.dequeueReusableCell(withIdentifier: reusableCellIdentifier, for: indexPath)
let item = dataForKey[indexPath.row]
cell.textLabel?.text = item.text // or whatever it is that you're doing with these pieces of data
return cell
}
通过这种方式,您可以使用numberOfRows
中的数组计数并索引到数组中,以获取cellForRow
中特定行的值。就IndexPath而言,你只想用它来索引你自己的cellForRow数据 - 你不需要存储索引路径。您需要以这样的方式定义RowItem
,使其具有配置单元所需的数据。因此,如果我的单元格有一些主要文本,一些细节文本和图像,我会像这样定义RowItem
:
struct RowItem {
var mainText: String
var detailText: String
var image: UIImage
}