2009-07-22 17 views
3

Ich brauche ein NSString zu bauen, die die folgenden ähnelt:Dynamisch, lokalisierte NSString

Name: Craig Buchanan
Telefon: 800-555-1212
E-Mail: [email protected]

Wo :

  • jede Zeile (zB Telefon) wird basierend auf dem Wert eines UISwitch
  • den Schlüsselteil eingeschlossen oder ausgeschlossen der Schnur (d. h. der Teil links von dem ':') ist lokalisiert
  • der Wertteil stammt von einem UITextField.

Mein Ansatz:

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

Ich habe ein paar Fragen:

  • ist dies ein ordentlicher Ansatz (ich bin ein Objective-C Noob)?
  • Ich merke, dass mein Array Autoreleased ist, aber ich bin noch besorgt über Speicherverbrauch. Soll ich den Pool für die automatische Freigabe freigeben? scheint ein bisschen gefährlich.
  • Ich hoffe, den Code ein bisschen dynamischer zu machen. Mein erster Gedanke ist, ein Array von Outlet-Variablen zu erstellen und dann das Tag des UISwitch zu verwenden, um den Schlüssel zu speichern, der die Lokalisierung steuert. Gedanken?

Vielen Dank für Ihre Zeit,

Craig Buchanan

Antwort

1

Ihre Zielsprache, vielleicht nicht Doppelpunkte verwenden, so nur telefonieren wie dies die lokalisierten Zeilen hinzuzufügen:

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

Was Mit der Autorelease-Frage können Sie einen lokalen Autorelease-Pool erstellen:

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

Schließlich können Sie das Kennzeichen des Schalters verwenden, um einen Array-Index anzugeben. Wenn Sie das tun, brauchen Sie nicht einmal eine IBOutlet Variable für den Schalter; Sie können einfach -viewForTag: oder das Argument der Aktionsmethode verwenden. Sie können NSIndexSet verwenden, um den Schaltzustand zu speichern, wenn Sie möchten. Aber wenn Sie dynamisch sein wollen, sollten Sie wahrscheinlich eine Tabelle verwenden, um die Schalter zu halten. Wenn Sie das tun, können Sie die Tabellenzeilennummer anstelle eines Tags verwenden.

+0

Ich nehme an, dass die lokalen Autorelease-Variablen automatisch einem lokal erstellten Autorelease-Pool zugewiesen werden, richtig? Findest du dich häufig damit? Wenn ich Ihren letzten Vorschlag verstehe, würde ich eine NSIndexSet-Variable auf Instanzebene haben, die auf der IBAction-Methode geändert werden würde, die den UISwitches zugewiesen ist? Diese Variable wird von der Methode, die die dynamische Zeichenfolge zur Steuerung des Lokalisierungsprozesses erstellt, in einer for-Schleife verwendet. Wahr? Danke. – craig

+0

Die Antwort ist "Ja" zu allem, was Sie sagten, außer dass ich nicht häufig lokale Autorelease-Pools verwende, da ich normalerweise das alloc/init-Muster in engen Schleifen verwende. –