iOS:以编程方式添加不同的tableviewcells

时间:2012-02-15 20:15:24

标签: objective-c ios4 uitableview

我想知道根据API中的数据创建和添加行到uitableview的最佳方法是什么。从API返回的数据如下所示。有些字段需要是标准文本,有些需要密码文本字段,有些数字字段,有些字段是开关和日期选择器字段。

我猜我需要在每个单元格中添加一个字段到我的UITableView以获得单元格基础。然后根据我正在添加的单元格,我将检索该单元格并将其添加到表格中。

我如何跟踪数据?当用户提交信息时,我如何知道哪个字段是哪个?

API返回的字段取决于他们在我们网站中启用的设置。订单将根据他们设置的sort_order而有所不同。

"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 个答案:

答案 0 :(得分:1)

您正在使用网络服务。根据用户设置,您可以按特定顺序返回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”键的值重新排序数组内容。虽然Web服务似乎尊重该顺序,但您可能希望以编程方式执行此操作。我建议在填充源数组之前执行此操作:

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

我没有测试那个代码,比较器可能是错误的,但你明白了。