iOS: программно добавлять разные ячейки таблицы - PullRequest
0 голосов
/ 16 февраля 2012

Я хотел бы знать, каков наилучший подход для создания и добавления строк в представление uitableview на основе данных из API. Данные, возвращаемые из API, будут выглядеть следующим образом. Некоторые поля должны быть стандартным текстом, некоторые - с помощью текстовых полей пароля, некоторые числовые поля, а некоторые - переключателями и полями выбора даты.

Я предполагаю, что мне нужно добавить поле в каждую ячейку в мой UITableView, чтобы иметь базу ячеек. Затем, в зависимости от ячейки, которую я добавляю, я получу эту ячейку и добавлю ее в таблицу.

Как я буду отслеживать данные? Когда пользователь отправляет информацию, как я узнаю, какое поле какое?

Поля, возвращаемые API, будут зависеть от того, какие настройки они включили на нашем сайте. И порядок будет зависеть от того, какой порядок сортировки они установили.

"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"
}
]

1 Ответ

1 голос
/ 16 февраля 2012

Вы используете веб-сервис. На основании пользовательских настроек вы получите ответ JSON в определенном порядке, составленный из определенных полей.

Вы уже проанализировали JSON и получили словарь с одним ключом ("data") для массива словарей, верно?

Самый простой подход - хранить эти словари в непостоянном массиве, NSMutableArray.
Вы знаете, какая ячейка является каким объектом , потому что у источника данных будет запрошена ячейка с конкретным номером строки . В ячейке для строки 0 будут отображаться поля первого словаря в массиве и т. Д.

NSDictionary *dictAtRow0 = [mySourceArray objectAtIndex:0];

Если вам интересно, как узнать, присутствует ли определенное поле в словаре, проверьте наличие соответствующего ключа в словаре, что-то вроде этого:

if([[dictAtRow0 allKeys] containsObject:@"field_name"]) {
    // here you know the dictionary has an entry for the key "field_name"
}

Также возможно изменить порядок содержимого массива на основе значения для ключа "sort_order". Хотя веб-сервис, похоже, соблюдает этот порядок, вы можете сделать это программно. Я рекомендую сделать это перед заполнением исходного массива:

// 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];

Я не тестировал этот код, возможно, компаратор глючит, но вы поняли.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...