Usually I store data in an array. Then, when cellForRowAtIndexPath is called I just look at row and select an item on the array based on row and process.
But UITableView as we know can do group view.
So what should I do?
Should I have an array of array? An NSDictionary of array? What would be the most elegant way to store data in UITableView structure?
For example an array of dictionaries, where each dictionary holds the title and all items of one section:
NSArray *dataSource = @[
@{@"title": @"Section 0",
@"rows" : @[ item00, item01, item02] },
@{@"title": @"Section 1",
@"rows" : @[ item10, item11, item12] },
@{@"title": @"Section 2",
@"rows" : @[ item20, item21, item22] },
];
The items can be strings or objects of a custom class. Then you can
access each item in cellForRowAtIndexPath
like
Item *item = dataSource[indexPath.section][@"rows"][indexPath.row];
and all other data source methods are also easily implemented.
@Martin answer is correct for Objective-C but in Swift, we don't have the luxury of having variable types
for a dictionary. The types are predefined.
We will need use struct
or custom data type to work around.
struct Model<Item>{
let title: String
let rows: [Item]
subscript(index: String) -> [Item] {
get {
return rows
}
}
}
let model1 = Model(title: "Secton 0", rows: ["A", "B", "C"])
let model2 = Model(title: "Secton 1", rows: ["D", "E", "F"])
let dataSource = [model1, model2]
// You can query
dataSource[indexPath.section][rows][indexPath.row]
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With