kevinstueber
kevinstueber

Reputation: 2956

iOS UITableView Only Reloads Cell Data When Scrolling

I am working on my first Objective-C app for iOS and am having an issue with reloading the data in a UITableView.

After reloading the data the cell content will only update when the cell is scrolled above of below the viewable area of the container.

Here is my .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

and .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

When I call [self.tableView description]the result is null, but if I call it from cellForRowAtIndexPath then I get the following result:

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

Here's a screenshot of interface builder: enter image description here

All help is appreciated! Thanks!

Upvotes: 0

Views: 1438

Answers (2)

Peter Cetinski
Peter Cetinski

Reputation: 2336

It looks like you may have not hooked up your UITableView with the HelloWorldViewController tabelView property in IB.

Upvotes: 0

Zalykr
Zalykr

Reputation: 1524

You're probably not connecting the UITableView in the interface builder..

You have to drag while pressing ctrl from the file's owner to the UITableView and connect it.

Also, you should not access your properties without self, you should do:

@synthesize tableViewArray = _tableViewArray;

and then access it with:

self.tableViewArray

try to avoid accessing your ivars directly, use the property!

Good luck!

Upvotes: 4

Related Questions