动态的,本地化的NSString

时间:2009-07-22 20:05:22

标签: iphone string iphone-sdk-3.0

我需要构建一个类似于以下内容的NSString:

姓名:Craig Buchanan
电话:800-555-1212
电子邮件:name@company.com

其中:

  • 根据UISwitch的值
  • 包含或排除每一行(例如电话)
  • 字符串的关键部分(即':'左侧的部分)已本地化
  • 值部分来自UITextField。

我的方法:

NSMutableArray *values = [[NSMutableArray alloc] initWithCapacity:3];

if (self.nameSwitch.isOn) 
    [values addObject:[NSString stringWithFormat:@"%@: %@", NSLocalizedString(@"Name", @"Name label"), textFieldName.text]];
if (self.telephoneSwitch.isOn)
    [values addObject:[NSString stringWithFormat:@"%@: %@", NSLocalizedString(@"Telephone", @"Telephone number label"), textFieldTelephone.text]];
if (self.emailSwitch.isOn)
    [values addObject:[NSString stringWithFormat:@"%@: %@", NSLocalizedString(@"Email", @"Email address label"), textFieldEmail.text]];

return [values componentsJoinedByString:@"\r"];

我有几个问题:

  • 这是一个不错的方法(我是一个客观的c菜鸟)?
  • 我意识到我的阵列是自动释放的,但我仍然担心内存使用情况。我应该发布自动发布池吗?似乎有点危险。
  • 我希望让代码更有活力。我最初的想法是创建一个插座变量数组,然后使用UISwitch的标签来存储驱动本地化的键。想法?

感谢您的时间,

Craig Buchanan

1 个答案:

答案 0 :(得分:1)

您的目标语言可能不使用冒号,因此只需进行这样的调用即可添加本地化的行:

[values addObject:[NSString stringWithFormat:NSLocalizedString(@"Name: %@", @"Name line"), name];

至于autorelease问题,您可以创建一个本地自动释放池:

NSAutoreleasePool *myPool = [[NSAutoreleasePool alloc] init];
// Do stuff.
[myPool release];

最后,您可以使用switch的标记来指示数组索引。如果你这样做,你甚至不需要一个IBOutlet变量用于交换机;你可以使用-viewForTag:或action方法的参数。如果您愿意,可以使用NSIndexSet存储开关状态。但是如果你想成为动态的,你应该使用一个表来保存开关。如果这样做,您可以使用表格行号而不是标记。