UITableViewDataSource的优雅数据模型

时间:2010-11-17 04:23:16

标签: iphone objective-c uitableview

我有一个基本上存储联系信息的模型:电话,推特,地址等。 我需要在UITableView中显示数据,所以我基本上需要3条信息:标签(“电话”),实际数据(“(123)456-789”)和用右边处理数据的URL申请(“tel:// whatever”)。

我正在考虑使用3个数组,每个信息对应一个,并查看每个属性,看看是否给出(可以是可选的),如果是,则将内容添加到该属性的3个数组中。

然后,在表视图的数据源中,每行可以引用3个数组中的索引来填充单元格。

订单很重要,所以我可以在电话等之前显示地址

任何人都可以想出一种更优雅的方式来设计模型,这样我就不需要3个阵列,或者很多:

if(self.phone != nil)
{
  [labels addObject:@"foo"];
  [descs addObject:self.phone];
  [urls addObject:@"baz"];
}

根据某些外部条件,只有一个“联系人”可以拥有不同数量的属性。所以每个属性都是可选的。表格视图将按特定顺序显示该联系人的属性。

谢谢!

1 个答案:

答案 0 :(得分:0)

我相信你应该创建一个模型类,每个属性都有属性。否则,有一天会回来咬你的屁股。

将值存储在数组中意味着您已将表示意义存储到模型中。打破MVC模式。

这也意味着您可以在模型对象中拥有一些实际逻辑,这将减少潜在的缺陷。举个例子:

// Contact.h
@interface Contact : NSObject {
}
@property(nonatomic, copy) NSString* phoneNumber;
@property(nonatomic, readonly) NSURL phoneNumberURL;
@end

// Contact.m
@implementation Contact
@synthesize phoneNumber;
-(NSURL*)phoneNumberURL {
    return [NSURL URLWithString:
        [@"tel:" stringByAppendingString:self.phoneNumber]];
}
@end

这样您就不必从模型对象外部更新URL。模型对象应该能够自己获取此信息。这将确保您的应用程序逻辑不会分散到许多不同的位置,而是保存在易于维护的明确的逻辑口袋中。