2009-07-22 60 views
3

我需要建立一個類似於以下的NSString:動態,本地化NSString的

名稱:克雷格·布坎南
電話:800-555-1212
電子郵件:[email protected]

在哪裏:

  • 每一行(例如,電話)被包括或基於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"]; 

我有幾個問題:

  • 這是一個體面的方式(我是一個Objective-C小白)?
  • 我意識到,我的陣列會被自動釋放,但我仍然很擔心內存使用情況。我應該釋放自動釋放池嗎?似乎有點危險。
  • 我希望使代碼更動態一點。我最初的想法是創建一個插座變量數組,然後使用UISwitch的標籤存儲驅動本地化的密鑰。想法?

感謝您的時間,

克雷格·布坎南

回答

1

目標語言可能不使用冒號,所以只需撥打電話,這樣對局部線路添加:

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

至於自動釋放的問題,你可以做一個本地自動釋放池:

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

最後,您可以使用開關的標記來指示數組索引。如果你這樣做,你甚至不需要交換機的IBOutlet變量;你可以使用-viewForTag:或動作方法的參數。如果願意,可以使用NSIndexSet來存儲交換機狀態。但是,如果你想成爲動態的,你應該使用一個表來保存開關。如果你這樣做,你可以使用表格行號而不是標籤。

+0

我假設本地自動釋放變量被自動分配給本地創建的自動釋放池,對嗎?你發現自己經常使用它嗎? 如果我理解你的最後一個建議,我將有一個實例級別的NSIndexSet變量,它會在分配給UISwitch的IBAction方法上發生變化?通過創建動態字符串以驅動本地化進程的方法,該變量將用於for循環。真正? 謝謝。 – craig 2009-07-24 16:36:44