2012-03-23 13 views
0

Ich arbeite an meiner ersten Objective-C-App für iOS und habe ein Problem mit dem Neuladen der Daten in einem UITableView.iOS UITableView lädt nur Zellendaten beim Scrollen

Nach dem erneuten Laden der Daten wird der Zelleninhalt nur aktualisiert, wenn die Zelle oberhalb des sichtbaren Bereichs des Containers verschoben wird.

Hier ist mein .h Code:

#import <UIKit/UIKit.h> 
#import "AFHTTPClient.h" 
#import "AFJSONRequestOperation.h" 

@interface HelloWorldViewController : UIViewController <UITextFieldDelegate, UITableViewDelegate, UITableViewDataSource>{ 
    NSMutableArray *tableViewArray; 
    IBOutlet UITableView *tableView; 
} 
@property (nonatomic, retain) NSMutableArray *tableViewArray; 
@property (weak, nonatomic) IBOutlet UILabel *connectionLabel; 
@property (nonatomic, retain) IBOutlet UITableView *tableView; 
@property (weak, nonatomic) IBOutlet UITextView *textArea; 
@property (weak, nonatomic) IBOutlet UITextField *textField2; 
@property (weak, nonatomic) IBOutlet UILabel *label; 
@property (weak, nonatomic) IBOutlet UITextField *textField; 
@property (copy, nonatomic) NSString *userName; 
@property (copy, nonatomic) NSString *passWord; 
@property (copy, nonatomic) NSMutableString *serverResponse; 
- (IBAction)callHome:(id)sender; 
@end 

und .m Code:

#import "HelloWorldViewController.h" 

@interface HelloWorldViewController() 

@end 

@implementation HelloWorldViewController 
@synthesize tableViewArray; 
@synthesize connectionLabel; 
@synthesize userName = _userName; 
@synthesize passWord = _password; 
@synthesize serverResponse = _serverResponse; 
@synthesize tableView; 
@synthesize textArea; 
@synthesize textField2; 
@synthesize label; 
@synthesize textField; 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    tableViewArray = [[NSMutableArray alloc] init]; 
    [tableViewArray addObject:@"TEST1"]; 
    [tableViewArray addObject:@"TEST2"]; 
    [tableViewArray addObject:@"TEST3"]; 
} 

- (void)viewDidUnload 
{ 
    [self setTextField:nil]; 
    [self setLabel:nil]; 
    [self setTextField2:nil]; 
    [self setTextArea:nil]; 
    [self setTableView:nil]; 
    [self setConnectionLabel:nil]; 
    [super viewDidUnload]; 
} 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) { 
     return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown); 
    } else { 
     return YES; 
    } 
} 

- (BOOL)textFieldShouldReturn:(UITextField *)theTextField { 
    if (theTextField == self.textField) { 
     [theTextField resignFirstResponder]; 
    } 
    return YES; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    return [tableViewArray count]; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    static NSString *CellIdentifier = @"Cell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 

    cell.textLabel.text = [self.tableViewArray objectAtIndex: [indexPath row]]; 
    return cell; 
} 

- (IBAction)callHome:(id)sender { 
    self.userName = self.textField.text; 
    self.passWord = self.textField2.text; 

    NSMutableString *tempResponse = [[NSMutableString alloc] initWithFormat:@""]; 

    AFHTTPClient *client = [[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:@"http://example.com/"]]; 

    [client setAuthorizationHeaderWithUsername:self.userName password:self.passWord]; 

    [client getPath:@"login.do" parameters:nil 
      success:^(AFHTTPRequestOperation *operation , id responseObject){ 
       NSLog(@"Authentication Success: %d", operation.response.statusCode); 
       self.serverResponse = [NSMutableString stringWithFormat:@"Authentication Success: %d", operation.response.statusCode ]; 
       [tempResponse appendString: self.serverResponse]; 
       self.textArea.text = tempResponse; 
      } 
      failure:^(AFHTTPRequestOperation *operation , NSError *error){ 
       NSLog(@"Authentication Error: %@\n%@", error, operation); 
      } 
    ]; 

    [client getPath:@"test.json.do" parameters:nil 
      success:^(AFHTTPRequestOperation *operation , id responseObject){ 
       NSLog(@"Retrieval Success: %d", operation.response.statusCode); 
       NSDictionary *results = [operation.responseString JSONValue]; 
       NSMutableArray *buildings = [results objectForKey:@"buildings"]; 
       NSMutableArray *names = [[NSMutableArray alloc] init]; 
       for (NSDictionary *building in buildings) 
       { 
        [names addObject:[building objectForKey:@"name"]]; 
       } 
       self.tableViewArray = names; 
       self.serverResponse = [NSMutableString stringWithFormat:@"\nBuilding List Retrieval Success: %d", operation.response.statusCode ]; 
       [tempResponse appendString: self.serverResponse]; 
       self.connectionLabel.text = tempResponse; 
      } 
      failure:^(AFHTTPRequestOperation *operation , NSError *error){ 
       NSLog(@"Retrieval Error: %@\n%@", error, operation); 
      } 
    ]; 

    NSLog(@"tableView is: %@", [tableView description]); 
    [tableView reloadData]; 
} 

@end 

Als ich [self.tableView description] nennen das Ergebnis null ist, aber wenn ich es aus cellForRowAtIndexPath rufen dann bekomme ich die folgendes Ergebnis:

tableView is: <UITableView: 0x8a71000; frame = (0 0; 280 191); clipsToBounds = YES; autoresize = W+H; layer = <CALayer: 0x6b7e860>; contentOffset: {0, 0}>. Delegate: HelloWorldViewController, DataSource: HelloWorldViewController 

Hier ist ein Screenshot des Interface Builders: enter image description here

Alle Hilfe ist willkommen! Vielen Dank!

+0

Ich habe einen Screenshot von Interface Builder hinzugefügt. Ich ziehe die Strg-Taste von der markierten Tabellenansicht zum Hello World View Controller. Danke nochmal ... – kevinstueber

Antwort

4

Du bist wahrscheinlich nicht die UITableView im Interface Builder verbinden ..

Sie müssen ziehen, während Abfrage aus der Datei Eigentümer an den UITableView drücken und verbinden.

Außerdem sollten Sie nicht Ihre Eigenschaften zugreifen, ohne sich selbst, sollten Sie tun:

@synthesize tableViewArray = _tableViewArray; 

und dann Zugriff mit:

self.tableViewArray 

versuchen Ihre ivars direkt zu vermeiden zuzugreifen, verwenden Sie die Eigenschaft !

Viel Glück!

+0

Danke für deine Antwort Heliem. Ich habe der Frage einen Screenshot hinzugefügt. Vielleicht ziehe ich an den falschen Ort? – kevinstueber

+0

Sie müssen anders herum ziehen, vom View-Controller in die markierte Tabellenansicht – Zalykr

+0

Ha! Xcode ist manchmal zu lustig! Das war's. Danke für Ihre Hilfe! – kevinstueber

0

Es scheint, als ob Sie Ihr UITableView nicht mit der HelloWorldViewController-Eigenschaft tableView in IB verbunden haben.

+0

Hallo Peter, danke für deine Hilfe. Ich habe der Frage einen Screenshot meines Interface Builders hinzugefügt. Bitte lassen Sie mich wissen, wenn etwas fehl am Platz erscheint. – kevinstueber

Verwandte Themen