Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What would be a good data structure for UITableView in grouped mode

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?

like image 202
user4951 Avatar asked Nov 26 '13 12:11

user4951


2 Answers

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.

like image 86
Martin R Avatar answered Sep 30 '22 20:09

Martin R


@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]
like image 45
Rahul Avatar answered Sep 30 '22 19:09

Rahul