Reputation: 11855
I would like to know what the best approach would be for creating and adding rows to a uitableview based on data from an API. The data returned from the API would look like the below. Some fields will need to be standard text, some would need to by password text fields, some number fields and some would be switches and date picker fields.
I'm guessing I need to add a field one of each cells to my UITableView in order to have the cell base. Then depending on the cell I am adding at the time I will retrieve that cell and add it to the table.
How would I keep track of the data? When the user submits the info how will I know which field is which?
The fields returned by the API will depend on which settings they have enabled within our site. And the order will vary depending on what sort_order they have set.
"data": [
{
"field_name": "location_id",
"display_name": "Home Location",
"page_cust": "O",
"sort_order": "10"
},
{
"field_name": "first_name",
"display_name": "First Name1",
"page_cust": "R",
"sort_order": "20"
},
{
"field_name": "middle_name",
"display_name": "Middle Name",
"page_cust": "O",
"sort_order": "25"
},
{
"field_name": "last_name",
"display_name": "Last Name1",
"page_cust": "R",
"sort_order": "30"
},
{
"field_name": "address1",
"display_name": "Address",
"page_cust": "O",
"sort_order": "40"
},
{
"field_name": "address2",
"display_name": "Address 2",
"page_cust": "O",
"sort_order": "45"
},
{
"field_name": "city",
"display_name": "City",
"page_cust": "O",
"sort_order": "50"
},
{
"field_name": "state",
"display_name": "State",
"page_cust": "O",
"sort_order": "60"
},
{
"field_name": "zip",
"display_name": "Zip Code",
"page_cust": "O",
"sort_order": "70"
},
{
"field_name": "day_phone",
"display_name": "Daytime Phone",
"page_cust": "O",
"sort_order": "80"
},
{
"field_name": "night_phone",
"display_name": "Evening Phone",
"page_cust": "O",
"sort_order": "90"
},
{
"field_name": "cell_phone",
"display_name": "Cell Phone",
"page_cust": "O",
"sort_order": "100"
},
{
"field_name": "email",
"display_name": "eMail",
"page_cust": "O",
"sort_order": "110"
},
{
"field_name": "login",
"display_name": "Login",
"page_cust": "O",
"sort_order": "120"
},
{
"field_name": "password",
"display_name": "Password",
"page_cust": "O",
"sort_order": "130"
},
{
"field_name": "lead_id",
"display_name": "Heard Via?",
"page_cust": "O",
"sort_order": "140"
},
{
"field_name": "contact_okay",
"display_name": "Contact Okay",
"page_cust": "O",
"sort_order": "170"
},
{
"field_name": "call_okay",
"display_name": "Call Okay",
"page_cust": "O",
"sort_order": "180"
},
{
"field_name": "email_okay",
"display_name": "E-mail Okay",
"page_cust": "O",
"sort_order": "190"
},
{
"field_name": "mail_okay",
"display_name": "Mail Okay",
"page_cust": "O",
"sort_order": "200"
},
{
"field_name": "payment_type_id",
"display_name": "Payment Method",
"page_cust": "O",
"sort_order": "210"
},
{
"field_name": "employer",
"display_name": "Company",
"page_cust": "O",
"sort_order": "260"
},
{
"field_name": "occupation",
"display_name": "Occupation",
"page_cust": "O",
"sort_order": "270"
},
{
"field_name": "birth_date",
"display_name": "Birth Date",
"page_cust": "O",
"sort_order": "280"
},
{
"field_name": "gender",
"display_name": "Gender",
"page_cust": "O",
"sort_order": "290"
},
{
"field_name": "status_id",
"display_name": "Status",
"page_cust": "O",
"sort_order": "340"
},
{
"field_name": "allow_login",
"display_name": "Allow to Log In",
"page_cust": "O",
"sort_order": "350"
},
{
"field_name": "customer_type_id",
"display_name": "Customer Type",
"page_cust": "O",
"sort_order": "360"
},
{
"field_name": "rep_id",
"display_name": "Assigned To",
"page_cust": "O",
"sort_order": "370"
},
{
"field_name": "account",
"display_name": "Account Number",
"page_cust": "O",
"sort_order": "380"
},
{
"field_name": "needs",
"display_name": "Special Needs",
"page_cust": "O",
"sort_order": "390"
}
]
Upvotes: 0
Views: 189
Reputation:
You are consuming a web-service. Based on user setting you get back a JSON response in some particular order and composed by particular fields.
You already parsed the JSON, and you get a dictionary with one key ("data"
) for an array of dictionaries, right ?
The simplest approach is to store these dictionaries in a mutable array, NSMutableArray
.
You know which cell is which object, because the datasource will be asked for the cell at a particular row number. Cell for row 0 will display fields of the first dictionary in the array, and so on.
NSDictionary *dictAtRow0 = [mySourceArray objectAtIndex:0];
If you wonder how to know if a particular field is present in the dictionary, test the presence of the corresponding key in the dictionary, something like this :
if([[dictAtRow0 allKeys] containsObject:@"field_name"]) {
// here you know the dictionary has an entry for the key "field_name"
}
It is also possible to reorder the array content based on the value for the "sort_order" key. Although the web-service seems to respect that order, you might want to do it programmatically. What I recommend is to do it before populating the source array :
// you parsed JSON and get the dictionary
NSArray *sortedArray = [[mainDict objectForKey:@"data"] sortedArrayUsingComparator: ^(id a, id b) {
NSNumber *first = [NSNumber numberWithInteger:[[a objectForKey:@"sort_order"] integerValue]];
NSNumber *second = [NSNumber numberWithInteger:[[b objectForKey:@"sort_order"] integerValue]];
return [first compare:second];
}];
mySourceArray = [[NSMutableArray alloc] initWithArray:sortedArray];
I didn't test that code, the comparator is maybe buggy but you got the idea.
Upvotes: 1