App Entwicklung Server Monitoring Tool Anfänger Hilfe

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Nunja, er ist gebaut auf dem Storyboard und eine prototype cell ist daran gebaut die den Identifier "Cell" hat.
    Soweit ist alles sichtbar, es springt nur nicht in die Methode. Alles andere, der Abruf der Daten über die NSURLConnection und die JSONSeririalization funktionieren. Das mit den Images und den Texten klappt wunderbar.
    Gesendet wird was ich schrieb.
    Da ich nicht an der App rumfummeln sollte sobald neuer server kommt oder sich mal die adresse von einem ändert und ich so also eine darstellung brauche und keinen vergleich innerhalb der app wollte ich jetzt eine tableView benutzen auf empfehlung.
    Bisher ist es ja:
    Daten kommen.for jeden eintrag in dem jsonArray welches für den augenblick als Dic verwendet wird wir abgefragt ob er vom inhalt von "Servername" gleich ist wie eine der 5 Strings die fest im programm stehn und je nach fall wird einen image ein bild zugeordnet.
    Aber wie gesagt, das kann jetzt keine option mehr sein diese Strings jedes mal umzuschreiben, oder neue hinzuzufügen und auch mehr abfragen pro server einzutragen.
    Implementierungsfile sieht folgendermaßen aus :

    Quellcode

    1. #import "XYZViewController.h"
    2. @interface XYZViewController ()
    3. @end
    4. @implementation XYZViewController
    5. @synthesize onOffView1;
    6. @synthesize onOffView2;
    7. @synthesize onOffView3;
    8. @synthesize onOffView4;
    9. @synthesize onOffView5;
    10. @synthesize jsonArray;
    11. - (void) viewWillAppear:(BOOL)animated
    12. {
    13. //Before the first view appears this will happen
    14. NSLog(@"ViewWillAppear");
    15. [super viewWillAppear:YES];
    16. //UpdateContent manages the Connection and returns the request data
    17. (JSON) for decoding and using it
    18. NSLog(@"Immerhin geht es weiter");
    19. }
    20. - (void)viewDidLoad
    21. {
    22. [super viewDidLoad];
    23. //Do any additional setup after loading the view, typically from a nib.
    24. NSLog(@"Aber in did load springt es noch");
    25. [self updateContent];
    26. self.jsonArray = [[NSMutableArray alloc] init];
    27. }
    28. - (void)viewDidUnload
    29. {
    30. [self setOnOffView1:nil];
    31. [self setOnOffView2:nil];
    32. [self setOnOffView3:nil];
    33. [self setOnOffView4:nil];
    34. [self setOnOffView5:nil];
    35. [super viewDidUnload];
    36. //Release any retained subviews of the main view.
    37. }
    38. - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
    39. {
    40. return
    41. (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
    42. }
    43. - (IBAction)postRequestButton:(id)sender
    44. {
    45. [self updateContent];
    46. }
    47. - (void) updateContent
    48. {
    49. NSLog(@"updateContent");
    50. //Request initiates
    51. NSURLRequest *jsonRequest = [NSURLRequest requestWithURL:[NSURL
    52. URLWithString:@"http://172.17.2.45/server/abrufen.php"]
    53. cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60];
    54. NSURLConnection *theConnection =[[NSURLConnection alloc]
    55. initWithRequest:jsonRequest delegate:self];
    56. //NSURLConnection initiates the download of the content in the requested site
    57. [theConnection start];
    58. }
    59. #pragma mark - NSURLConnection Delegate
    60. //Pragma Mark is just for sorting, it doesn't do anything with the code
    61. - (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    62. //This
    63. methode is called if the Delegate got the message that the connection has
    64. finished downloading the content.
    65. NSLog(@"connectionDidFinishLoading");
    66. }
    67. - (void) connection:(NSURLConnection *)connection
    68. didReceiveData:(NSData *)data {
    69. //This methode is called if the Delegates got the message that the Data has been received
    70. //Here you can modify and use your Data
    71. //The Data that contains JSON code gets decoded, the new jsonDictionary contains the
    72. content of Data, decoded from JSON
    73. NSError* error = nil;
    74. self.jsonArray = [NSJSONSerialization JSONObjectWithData:data
    75. options:NSJSONReadingMutableContainers error:&error];
    76. if(error) {
    77. NSLog(@"Fail");
    78. }
    79. for(NSDictionary *server in jsonArray)
    80. {
    81. NSLog(@"Servername: %@", [server objectForKey:@"servername"]);
    82. NSLog(@"is_on: %@", [server objectForKey:@"is_on"]);
    83. NSString *path = [server objectForKey:@"servername"];
    84. NSString *truth = @"1";
    85. NSString *link1 = @"www.meineseite1.de";
    86. NSString *link2 = @"172.17.0.217";
    87. NSString *link3 = @"www.meineseite2";
    88. NSString *link4 = @"www.google.de";
    89. NSString *link5 = @"172.17.2.87";
    90. if([path isEqualToString:link1])
    91. {
    92. if([[server objectForKey:@"is_on"] isEqualToString:truth])
    93. {
    94. onOffView1.image = [UIImage imageNamed:@"on.png"];
    95. }
    96. else
    97. {
    98. onOffView1.image = [UIImage imageNamed:@"off.png"];
    99. }
    100. }
    101. else
    102. if ([path isEqualToString:link2])
    103. {
    104. if([[server objectForKey:@"is_on"] isEqualToString:truth])
    105. {
    106. onOffView2.image = [UIImage imageNamed:@"on.png"];
    107. }
    108. else
    109. {
    110. onOffView2.image = [UIImage imageNamed:@"off.png"];
    111. }
    112. }
    113. else if ([path isEqualToString:link3])
    114. {
    115. if([[server objectForKey:@"is_on"] isEqualToString:truth])
    116. {
    117. onOffView3.image = [UIImage imageNamed:@"on.png"];
    118. }
    119. else
    120. {
    121. onOffView3.image = [UIImage imageNamed:@"off.png"];
    122. }
    123. }
    124. else
    125. if ([path isEqualToString:link4])
    126. {
    127. if([[server objectForKey:@"is_on"] isEqualToString:truth])
    128. {
    129. onOffView4.image = [UIImage imageNamed:@"on.png"];
    130. }
    131. else
    132. {
    133. onOffView4.image = [UIImage imageNamed:@"off.png"];
    134. }
    135. }
    136. else if ([path isEqualToString:link5])
    137. {
    138. if([[server objectForKey:@"is_on"] isEqualToString:truth])
    139. {
    140. onOffView5.image = [UIImage imageNamed:@"on.png"];
    141. }
    142. else
    143. {
    144. onOffView5.image = [UIImage imageNamed:@"off.png"];
    145. }
    146. }
    147. }
    148. }
    149. -(NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    150. {
    151. return [self.jsonArray count];
    152. }
    153. -(UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    154. {
    155. static NSString *CellIdentifier = @"Cell";
    156. UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    157. if (cell == nil) {
    158. cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    159. }
    160. NSDictionary *dictionary = [self.jsonArray objectAtIndex:[indexPath row]];
    161. cell.textLabel.text = [dictionary objectForKey:@"servername"];
    162. //nächste 2 zeilen wurden hier, im Forum aktualisiert
    163. NSString *comparer = [dictionary objectForKey:@"is_on"];
    164. if ([comparer isEqualToString:@"1"]) {
    165. [cell.contentView setBackgroundColor:[UIColor greenColor]];
    166. }
    167. else {
    168. [cell.contentView setBackgroundColor: [UIColor redColor]];
    169. }
    170. return cell;
    171. }
    172. @end
    Alles anzeigen


    Wenn es was gibt was total anfängermäßig aussieht liegts daran, dass ich einer bin :|
    Und aus Word kopieren (von texteditor zu win öffnet word das >_>) und dieses gefriemel mit dem mitschicken der formatierung ist sehr nervig

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von AlexSuo ()

  • Ok, jez verstehe ich gar nicht mehr.
    Ich wollte nach links drehen das ganze, also layout left um das zu testen, plötzlich erscheint die tabelle einfach so bei genau dem code wo sie bei dem standart also senkrecht und gerade nicht zu sehen war. als ich sie zurückdrehte ist sie jez auch im standart verfügbar und ausgefüllt..
    WOran kann das liegen? erst wenn ich auf panorama gehe wird die tabelle gefüllt..


    Und ein anderes problem habe ich noch, ich will ja abfragen

    Quellcode

    1. if ([dictionary objectForKey:@"is_on"]) {
    2. [cell.contentView setBackgroundColor:[UIColor greenColor]];
    3. }
    4. else {
    5. [cell.contentView setBackgroundColor: [UIColor redColor]];
    6. }


    Und natürlich ist es dann IMMER grün, weil ich es nicht hinbekomme einen vergleich herzustellen.
    Ich kann kein isEqualToString nutzen und auch keinen einfachen vergleich.
    Ich weiß nicht genau wie ich den vergleich schaffen kann.


    gelöst. hab einfach vorher einfach noch einen NSString namens comparer gemacht und ihm den inhalt von objectForKey: @"is_on" zugewiesen, dann damit verglichen, funktioniert wunderbar. Ich komme mittlerweile schon selbst auf die lösungen, es geht voran :P
    Code oben werd ich damit aktualisieren.



    Das Einzige Problem was also noch besteht ist, dass die tableView erst ausgefüllt und angezeigt wird wenn ich einmal das Gerät geschwenkt habe sodass sich Panorama aktiviert, ab dann ist es immer da.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von AlexSuo ()

  • AlexSuo schrieb:

    Ok, jez verstehe ich gar nicht mehr.
    Ich wollte nach links drehen das ganze, also layout left um das zu testen, plötzlich erscheint die tabelle einfach so bei genau dem code wo sie bei dem standart also senkrecht und gerade nicht zu sehen war. als ich sie zurückdrehte ist sie jez auch im standart verfügbar und ausgefüllt..
    WOran kann das liegen? erst wenn ich auf panorama gehe wird die tabelle gefüllt..

    Weil dann der TableView sich die Daten neu aus der DataSource holt. Wenn Du die Daten vom Server abgeholt hast, musst Du dem TableView ein reloadData schicken.

    AlexSuo schrieb:

    Und ein anderes problem habe ich noch, ich will ja abfragen

    Quellcode

    1. if ([dictionary objectForKey:@"is_on"]) {
    2. [cell.contentView setBackgroundColor:[UIColor greenColor]];
    3. }
    4. else {
    5. [cell.contentView setBackgroundColor: [UIColor redColor]];
    6. }


    Und natürlich ist es dann IMMER grün, weil ich es nicht hinbekomme einen vergleich herzustellen.
    Ich kann kein isEqualToString nutzen und auch keinen einfachen vergleich.
    Ich weiß nicht genau wie ich den vergleich schaffen kann.


    gelöst. hab einfach vorher einfach noch einen NSString namens comparer gemacht und ihm den inhalt von objectForKey: @"is_on" zugewiesen, dann damit verglichen, funktioniert wunderbar. Ich komme mittlerweile schon selbst auf die lösungen, es geht voran :P
    Code oben werd ich damit aktualisieren.

    In diesem konkreten Fall hilft Dir auch einfach:

    Quellcode

    1. if ([[dictionary objectForKey:@"is_on"] intValue]) {
    2. ...

    Michael
  • Und wo soll ich mir das senden? das tableview ist ja schon das letzte was die app macht, danach passiert ja nichts mehr scheinbar. Zumindest wird tableView wirklich nur in numberOfRowsInSection und in cellForRowAtIndexPath gekannt.
    und es springt beim ersten starten nur in numberOfRowsInSection, aber nicht in cellForRowAtIndexPath. erst nach schwänken
  • AlexSuo schrieb:

    Und wo soll ich mir das senden?

    Am besten in connectionDidFinishLoading: und in dieser Methode solltest Du auch erst Deine empfangenen Daten verarbeiten. Es ist nämlich nicht garantiert, dass Du Deine Daten in einem Stück angeliefert bekommst. Die Methode connection:didReceiveData: kann durchaus mehrfach aufgerufen werden. Lies das hier mal nach.

    AlexSuo schrieb:

    es springt beim ersten starten nur in numberOfRowsInSection, aber nicht in cellForRowAtIndexPath.

    Und hast Du mal kontrolliert, was tableView:numberOfRowsInSection: da zurückgibt? Wetten da wird 0 zurückgegeben?

    Michael
  • nachdem du deinen jsonArray hast und die for Schleife kannst du dir sparen wenn du das mit dem is_on in die Methode cellForRowAtIndexPath implementierst mit der Abfrage

    Quellcode

    1. if (is_on) {
    2. cell.imageView.image = on.png
    3. } else {
    4. cell.imageView.image = off.png
    5. }

    so mal kurz aus dem Kopf heraus, und lässt dann das mit dem cell.contentView weg
    [window close]
  • Es wird tatsächlich nichts zurückgeliefert.
    Aber wenn ich versuche die Daten in ConnectionDidFinishLoeading zu verarbeiten kommt exception mit Parameter 'data' is nil.
    ich hab versucht data als globale variable zu verwenden..ging leider auch nicht. ich geh da glaub ein wneig falsch an die sache ran. :|
    Die For schleife und das mit dem zuweisen der bilder ist was andres, darum gehts nicht, das funktioniert alles wunderbar. Aber da ich auch noch ein wenig lernen will und bisher nur mit festen variablen das kannte möchte ich jez gern das ganze als tableView gestalten, nur im moment hakts da ein wenig.
    Ich danke aber für eure eifrige hilfe :)
  • du solltest data als property deklarieren. Dann erzeugst du im receivedData immer ein neues Data Object inbdem du die neuen Daten an das alte dran hängst.
    also so mal ganz einfach

    im connection start:

    Quellcode

    1. self.myDataString=@"";

    im receivedData

    Quellcode

    1. self.myDataString=[NSString stringWithFormat:@"%@%@",myDataString,data];

    und im didFinsh hast du dann den ganzen String.

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)