String zusammen setzten

  • String zusammen setzten

    hallo,

    habe mal eine Frage,

    ich versuche folgendes:

    Quellcode

    1. NSString *theURL = kSETurl;
    2. theURL = [theURL stringByAppendingString:@"Temp="];
    3. theURL = [theURL stringByAppendingString:myTemo];
    4. theURL = [theURL stringByAppendingString:@"Feuchte="];
    5. theURL = [theURL stringByAppendingString:myFeuchte];
    6. theURL = [theURL stringByAppendingString:@"Bemerkung="];
    7. theURL = [theURL stringByAppendingString:myBemerkung];


    Ich möchte aus Textfelder einen String zusammen setzten den ich dann per Action an einen Webservice schicke.

    Ich hänge aber an der Zusammensetzung des Strings

    Hier noch meine IBOutlets

    Quellcode

    1. @property (weak, nonatomic) IBOutlet UITextField *myTemp;
    2. @property (weak, nonatomic) IBOutlet UITextField *myFeuchte;
    3. @property (weak, nonatomic) IBOutlet UITextField *myBemerkung;
    4. @property (weak, nonatomic) IBOutlet UITextField *txt_Test_Bemerkung;


    Schöne Grüße
    Matthias
  • matze1708 schrieb:

    hallo,

    habe mal eine Frage,

    ich versuche folgendes:

    Quellcode

    1. NSString *theURL = kSETurl;
    2. theURL = [theURL stringByAppendingString:@"Temp="];
    3. theURL = [theURL stringByAppendingString:myTemo];
    4. theURL = [theURL stringByAppendingString:@"Feuchte="];
    5. theURL = [theURL stringByAppendingString:myFeuchte];
    6. theURL = [theURL stringByAppendingString:@"Bemerkung="];
    7. theURL = [theURL stringByAppendingString:myBemerkung];


    Ich möchte aus Textfelder einen String zusammen setzten den ich dann per Action an einen Webservice schicke.

    Matthias


    Abgesehen davon, dass ich Dein Problem nicht verstehe, würde ich stringWithFormat: verwenden …
  • Vier Dinge.
    1. Achte auf Deine Variablennamen. Das Textfeld heißt myTemp, nicht myTemo. Überhaupt wären 'temperature', 'humidity' und 'comment' besser als myTemp, myFeuchte und myBemerkung.
      Zur Not gingen sicherlich auch therm und hygros. ;)
    2. Du bekommst die Zeichenketten aus einem Textfeld via [uiTextFieldInstance text].
    3. Es ist nur bedingt sinnvoll, sechs Instanzen zu erzeugen und zu verwerfen. [NSString stringByAppendingString:] erstellt jedes mal einen neuen String.
      Hier wäre ein NSMutableString und [NSMutableString appendString:] die speicherschonendere Variante. Oder halt das vorgeschlagene [NSString stringWithFormat:], wenn die Parameter bereits bei Erstellung des Strings feststehen und nicht dynamisch angehängt werden brauchen.
    4. Nenne doch bitte einen String nicht URL. Spätestens wenn Du ein NSURL benötigst, kommst Du durcheinander. Statt theURL wäre requestUrlString eine sinnvolle Namensalternative.
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • Marco Feltmann schrieb:

    Vier Dinge.
    [list=1]Achte auf Deine Variablennamen. Das Textfeld heißt myTemp, nicht myTemo. Überhaupt wären 'temperature', 'humidity' und 'comment' besser als myTemp, myFeuchte und myBemerkung.[/list]


    Nein,

    eigentlich richtige wäre mindestens myTempField perfekt dann myTempTextField. Dann wäre eigentlich auch klar gewesen, dass es sich dabei nicht um Strings handeln kann.

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Nun ja, ob der Typ der Variablen mit in den Namen gehört ist immer so schwer einzuschätzen.
    Jedenfalls halte ich es für blödsinnig, ein 'my' vorzusetzen und dann auch noch den Namen so abzukürzen, dass man erst einmal überlegen muss, ob jetzt ein temporärer Wert oder eine Temperatur gemeint ist.

    Muss ich mein Textfeld zwingend temperatureTextField nennen? Die IDE weiß doch, dass es ein TextField ist…
    Wenn ich es benutze und [temperature text] sehe, dann weiß ich, dass mir temperature einen Text zurückliefert mit dem ich arbeite.
    Inwiefern ist es da von Belang, welchen Typen temperature hat und dass ich diesen Typ sofort sehe?

    Ja, ich habe genau das bei theURL vorgeschlagen.
    Denn wenn schon ein Typ im Variablennamen hängt, dann doch bitte auch der korrekte Typ.

    Natürlich habe ich keine Ahnung was hinter der nachher fertigen URL steckt.
    Vermutlich wäre ein Name wie weatherDataParameterLine am sinnvollsten.
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • Hallo,

    @Steve der ist gut.....

    Kann mir mal bitte einer ein Beispiel geben.

    Ich habe das irgendiwe noch nicht so geschnallt wie ich das zusammen setzten soll. Also so wie ich es gemacht habe ich es also nix....

    Ich sollte StringwithFormat verwenden? Wie bekomme ich aber nun den Inhalt aus dem Variablen Feld?
  • String zusammen setzten

    matze1708 schrieb:

    Hallo,

    @Steve der ist gut.....

    Kann mir mal bitte einer ein Beispiel geben.

    Ich habe das irgendiwe noch nicht so geschnallt wie ich das zusammen setzten soll. Also so wie ich es gemacht habe ich es also nix....

    Ich sollte StringwithFormat verwenden? Wie bekomme ich aber nun den Inhalt aus dem Variablen Feld?


    Wurde doch schon mehrfach genannt

    [deinTextfield text]
  • Zu Deinem Grundproblem wurde ja schon Einiges gesagt.

    Die URL bzw. die Web-Adresse würde ich nicht immer manuell zusammensetzen.
    Das würde ich eine Kategorie zu NSString oder NSURL auslagern.

    Du sammelst einfach alle Schlüssel und Werte in einem NSDictionary und lässt die in Deiner Helfer-Methode abnudeln.
    Somit hast Du immer eine schön kodierte Adresse und die Verwendung ist viel besser.

    Beispiel-Code, siehe unten…

    Viele Grüße

    Quellcode

    1. +(BOOL)doTheWebAddressTest
    2. {
    3. // …
    4. NSString *string = @"http://www.url.de";
    5. if([string length] < 1)
    6. {
    7. return NO;
    8. }
    9. // …
    10. NSMutableDictionary *mutableDictionary = [NSMutableDictionary dictionary];
    11. if(mutableDictionary == nil)
    12. {
    13. return NO;
    14. }
    15. // …
    16. [mutableDictionary setObject:@"Bäärlä"
    17. forKey:@"nachname"];
    18. // …
    19. [mutableDictionary setObject:@"Günni"
    20. forKey:@"vorname"];
    21. // …
    22. [mutableDictionary setObject:@"ich@me.com"
    23. forKey:@"email"];
    24. // …
    25. string = [NSString yz_urlAddress:string
    26. parameters:mutableDictionary
    27. sorted:YES
    28. encoding:NSUTF8StringEncoding];
    29. if([string length] < 1)
    30. {
    31. return NO;
    32. }
    33. // …
    34. NSLog(@"%@", string);
    35. // …
    36. return YES;
    37. // …
    38. }
    39. -(NSString*)yz_stringByAddingRFC2396PercentEscapesUsingEncoding:(NSStringEncoding)encoding
    40. {
    41. // …
    42. CFStringEncoding stringEncoding = CFStringConvertNSStringEncodingToEncoding(encoding);
    43. if(stringEncoding == kCFStringEncodingInvalidId)
    44. {
    45. return nil;
    46. }
    47. // …
    48. NSString *string = [(NSString*)CFURLCreateStringByAddingPercentEscapes(NULL,
    49. (CFStringRef)self,
    50. NULL,
    51. (CFStringRef)@"!#$ %&'()*+,/ : ;= ?@[]~",
    52. stringEncoding) autorelease];
    53. // …
    54. return string;
    55. // …
    56. }
    57. +(NSString*)yz_urlAddress:(NSString*)address
    58. parameters:(NSDictionary*)parameters
    59. sorted:(BOOL)sorted
    60. encoding:(NSStringEncoding)encoding
    61. {
    62. // …
    63. if([address length] < 1)
    64. {
    65. return nil;
    66. }
    67. // …
    68. if([parameters count] < 1)
    69. {
    70. return nil;
    71. }
    72. // …
    73. NSMutableString *mutableString = [NSMutableString string];
    74. if(mutableString == nil)
    75. {
    76. return nil;
    77. }
    78. // …
    79. NSArray *array = [parameters allKeys];
    80. // …
    81. if(sorted == YES)
    82. {
    83. array = [array sortedArrayUsingSelector:@selector(compare:)];
    84. }
    85. // …
    86. for(NSString *nString in array)
    87. {
    88. // …
    89. id object = [parameters objectForKey:nString];
    90. if(object == nil)
    91. {
    92. return nil;
    93. }
    94. // …
    95. if([object isKindOfClass:[NSString class]] == NO)
    96. {
    97. return nil;
    98. }
    99. // …
    100. NSString *string = object;
    101. // …
    102. string = [string yz_stringByAddingRFC2396PercentEscapesUsingEncoding:encoding];
    103. if([string length] < 1)
    104. {
    105. return nil;
    106. }
    107. // …
    108. [mutableString appendFormat:@"&%@=%@", nString, string];
    109. // …
    110. }
    111. // …
    112. if([mutableString length] < 1)
    113. {
    114. return nil;
    115. }
    116. // …
    117. [mutableString replaceCharactersInRange:NSMakeRange(0, 1)
    118. withString:@"?"];
    119. // …
    120. address = [address stringByAppendingString:mutableString];
    121. if([address length] < 1)
    122. {
    123. return nil;
    124. }
    125. // …
    126. return address;
    127. // …
    128. }
    129. @end
    Alles anzeigen
  • little_pixel schrieb:


    Das würde ich eine Kategorie zu NSString oder NSURL auslagern.


    Bitte nicht. Mit weniger Leerzeilen:

    Quellcode

    1. NSString *myTemo = @"26°C";
    2. NSString *myFeuchte = @"91%";
    3. NSString *myBemerkung = @"Mittwoch, 23:00 in กรุงเทพมหานคร อมรรัตนโกสินทร์ มหินทรายุธยามหาดิลก"\
    4. @" ภพนพรัตน์ราชธานีบุรีรมย์ อุดมราชนิเวศน์ มหาสถานอมรพิมาน อวตารสถิต สักกะทัตติยะ วิษณุกรรมประสิทธิ์";
    5. NSDictionary *query = @{@"Temp": myTemo, @"Feuchte": myFeuchte, @"Bemerkung": myBemerkung};
    6. NSMutableArray *queryItems = [NSMutableArray arrayWithCapacity:[query count]];
    7. [query enumerateKeysAndObjectsUsingBlock:^(NSString *name, NSString *value, BOOL *stop) {
    8. NSURLQueryItem *queryItem = [NSURLQueryItem queryItemWithName:name value:value];
    9. [queryItems addObject:queryItem];
    10. }];
    11. NSURLComponents *urlComponents = [[NSURLComponents alloc] init];
    12. urlComponents.scheme = @"http";
    13. urlComponents.host = @"myHorst";
    14. urlComponents.path = @"/myPath";
    15. urlComponents.queryItems = queryItems;
    16. NSLog(@"Here we go: %@", [urlComponents URL]);
    Alles anzeigen
  • SteveJ schrieb:

    little_pixel schrieb:


    Das würde ich eine Kategorie zu NSString oder NSURL auslagern.


    Bitte nicht. Mit weniger Leerzeilen:

    Quellcode

    1. NSString *myTemo = @"26°C";
    2. NSString *myFeuchte = @"91%";
    3. NSString *myBemerkung = @"Mittwoch, 23:00 in กรุงเทพมหานคร อมรรัตนโกสินทร์ มหินทรายุธยามหาดิลก"\
    4. @" ภพนพรัตน์ราชธานีบุรีรมย์ อุดมราชนิเวศน์ มหาสถานอมรพิมาน อวตารสถิต สักกะทัตติยะ วิษณุกรรมประสิทธิ์";
    5. NSDictionary *query = @{@"Temp": myTemo, @"Feuchte": myFeuchte, @"Bemerkung": myBemerkung};
    6. NSMutableArray *queryItems = [NSMutableArray arrayWithCapacity:[query count]];
    7. [query enumerateKeysAndObjectsUsingBlock:^(NSString *name, NSString *value, BOOL *stop) {
    8. NSURLQueryItem *queryItem = [NSURLQueryItem queryItemWithName:name value:value];
    9. [queryItems addObject:queryItem];
    10. }];
    11. NSURLComponents *urlComponents = [[NSURLComponents alloc] init];
    12. urlComponents.scheme = @"http";
    13. urlComponents.host = @"myHorst";
    14. urlComponents.path = @"/myPath";
    15. urlComponents.queryItems = queryItems;
    16. NSLog(@"Here we go: %@", [urlComponents URL]);
    Alles anzeigen


    ACHTUNG:

    NSURLQueryItem gibts erst in OS X 10.10
    NSURLComponents gibts erst seit OS X 10.9
  • little_pixel schrieb:

    Bitte nicht.

    Na klar, oder wie hast Du das bislang gemacht!?


    Kategorien sind kein Platz für Hilfsfunktionen, nur weil man nicht weiß wo man sie hin schreiben soll:

    little_pixel schrieb:

    Das würde ich eine Kategorie zu NSString oder NSURL auslagern.


    Allein die Tatsache das du nicht weißt ob NSString oder NSURL macht klar, dass du nicht das Verhalten einer Klasse erweitern willst, sondern einen Platz für Hilfsfunktionen suchst.

    little_pixel schrieb:


    Mit weniger Leerzeilen:

    … und sau schlecht zu lesen ;)


    Dein Beispielcode? Allerdings.

    little_pixel schrieb:

    Gabriel hat ja schon den springenden Punkt erwähnt


    Ich würde mal sagen er hat verpasst worum es geht...

    little_pixel schrieb:

    und zudem lernt der TE das Zusammensetzen von Strings.


    Er lernt sich was zusammen zu frickeln. Was gritsch natürlich nicht gemerkt hat: Apple hat eine vernünftige OO-API entworfen um das oben genannte Problem zu lösen. Die Hauptarbeit ist getan, wenn du das Ganze auf einer früheren Version haben willst musst du nur die API nachprogrammierten.

    Oder du lernst halt nicht OO-Programmierung, sondern Stringfrickelei in Kategorien verteilt. Geht auch.
  • [SteveJ]
    Kategorien sind kein Platz für Hilfsfunktionen, von denen man nicht weiß wo sie hinsollen?

    Aha. Wofür sind die Dinger denn bitte sonst da?
    Mit Kategorien kannst Du bestehende Objekte um weitere Funktionen erweitern. Welche Funktionen sollen das denn bitte sein, wenn keine Hilfsfunktionen?

    Klar, man kann und sollte es richtig machen.
    Sich für Mac OS X.8 die Funktionalität von NSURLComponents und NSURLQueryItems an Hand der API nachzufrickeln halte ich für den falschen Weg.

    Vom Hin und Her schieben in manuellen Blockschleifen mal ganz zu schweigen. Da ist der [NSString stringWithFormat:] Ansatz um Längen lesbarer. Zumindest was meinem Verständnis von Lesbarkeit entspricht. Es gibt ja Leute, die empfinden Java–Code als lesbar…

    Im Übrigen nervt mich Dein Zynismus gewaltig.
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • Hallo,
    Im Übrigen nervt mich Dein Zynismus gewaltig.

    Geht mir genau gleich.
    Ich kenne ihn nicht persönlich, aber ich lese das hier auch sehr reisserisch und provokativ heraus.

    Zu mal das was er sagt so einfach nicht korrekt ist und die Verpackung ist auch schlecht.

    Unveröffentlichte Methoden als Maßstab zu nehmen, da bin ich sprachlos.

    SteveJ, Apple hat intern immer genau den Weg genommen, wie in meiner Methode demonstriert.
    Rede mal mit den Buben… ;) … achso, Deiner Meinung nach ist das ja falsch.
    Die Notwendigkeit das besser zu machen haben sie erkannt und es deshalb in eine Klasse gekapselt.

    Allein die Tatsache das du nicht weißt ob NSString oder NSURL macht klar, dass du nicht das Verhalten einer Klasse erweitern willst

    Was will man dazu sagen!? Einfach Plunder.

    Ich klinke mich aus und erfreue mich meiner Arbeit :)
    Du kannst hier gerne weiter stänkern…

    Viele Grüße
  • Ich muss mal CFMutableString in den Raum werfen, will mich aber nicht an den philosophischen Diskussion hier beteiligen.

    developer.apple.com/library/io…f/doc/uid/20001183-101594

    Oder eben NSMutableString.

    developer.apple.com/library/io…ef/occ/cl/NSMutableString

    Gibt es seit iOS 2.0

    Das Problem an den NSString convinience Methoden ist das erzeugen vieler Objekte.
    Gerade das Kapitel "Mutable Strings With Client-Owned Buffers" sollte alle die interessieren die massiv XML oder JSON bearbeiten.

    Nein, CoreFoundation ist nicht veraltet.
    Ja, es macht Sinn die API zu benutzen. Man spart den ganzen Dispatch Kram von Objective C messages.
    Die Objekte sind toll-free bridged.

    Mir ist klar, dass jetzt wieder eine Menge blöde Kommentare kommen, aber man sollte seine Platform mal gesamt kennenlernen.
    Dasselbe gilt übrigens für CoreGraphics.
  • Hallo,

    vielen lieben Dank für soviel Hilfe und erklärung.

    Ich werde es mal, denke Heute ABend, einbauen.

    Es ist schon ein krasser unterschied von der Sprache VBA zu Objectiv-C. was in VBA mit paar Zeilchen daher kommt, ist hier schon ein riesen Code.

    Das aber meine IBOutlets myTemo ( MyTemp) Variable von UIView kommen ist hier egal oder?

    Dann las ich den NsString oben einfach weg. Deklariert sind die ja schon auf der.h Datei.... ??