iOS UITableView перезагружает только данные ячейки при прокрутке - PullRequest
0 голосов
/ 24 марта 2012

Я работаю над своим первым приложением Objective-C для iOS, и у меня возникла проблема с перезагрузкой данных в UITableView.

После перезагрузки данных содержимое ячейки будет обновляться только при прокрутке ячейки выше или ниже видимой области контейнера.

Вот мой код .h:

#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

и код .m:

#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

Когда я вызываю [self.tableView description] результат равен нулю, но если я вызываю его с cellForRowAtIndexPath, тогда я получаю следующий результат:

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

Вот скриншот конструктора интерфейса: enter image description here

Вся помощь приветствуется! Спасибо!

Ответы [ 2 ]

4 голосов
/ 24 марта 2012

Возможно, вы не подключаете UITableView в конструкторе интерфейсов ..

Вы должны перетащить, нажимая Ctrl от владельца файла, к UITableView и подключить его.

Кроме того, вы не должны получать доступ к своим свойствам без себя, вы должны сделать:

@synthesize tableViewArray = _tableViewArray;

и затем получить к нему доступ:

self.tableViewArray

Старайтесь избегать прямого доступа к вашим иварам, используйте собственность!

Удачи!

0 голосов
/ 24 марта 2012

Похоже, вы, возможно, не подключили свой UITableView со свойством HelloWorldViewController tabelView в IB.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...