2011-12-21 23 views
5

Tôi có một tình huống mà bảng của tôi đang tải trước khi nhận dữ liệu từ dịch vụ web của tôi.UITableView xuất hiện trước khi nhận dữ liệu từ connectionDidFinishLoading

Khi tôi gỡ lỗi, tôi có thể thấy rằng NSMutableArray của tôi có 123 đối tượng nhưng không được phản ánh trong bảng.

Đây là phương pháp connectionDidFinishLoading tôi:

-(void)connectionDidFinishLoading:(NSURLConnection *)conn{ 
myData = [[NSString alloc] initWithData:xData encoding:NSUTF8StringEncoding]; 
SBJsonParser *jParser = [SBJsonParser new]; 
NSError *error = nil; 
NSArray *jsonObjects = [jParser objectWithString:myData error:&error]; 
NSMutableArray *books = [[NSMutableArray alloc] init]; 

for(NSDictionary *dict in jsonObjects) 
{ 
    Book *b = [Book new]; 
    b.bookName =[dict objectForKey:@"name"]; 
    b.published = [dict objectForKey:@"published"]; 
    [books addObject:b]; 

} 
self.bookArray = books; 
[self.tableView reloadData]; 
NSLog(@"myData = %@",myData); 
} 

Nếu tôi gỡ lỗi này tôi nhận được của tôi jsonObjects và Populating sưu tập của tôi. Nhưng tôi nhận thấy bảng của tôi vẫn còn trống.

Chỉ cần làm rõ đây là phương pháp của tôi tableView:

(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 
... 
Book *b = (Book *)[self.bookArray objectAtIndex:[indexPath row]]; 
cell.textLabel.text = b.bookName; 
.... 

bất cứ ai có thể giúp tôi với những gì tôi đang thiếu?

+0

Hãy xem toàn bộ phương thức cellForRow. Bạn đã triển khai rowsForSection chưa? – Dancreek

+0

@Dancreek Tôi đoán bạn có nghĩa là numberOfRowsForSection? Dù sao, đó và [tableview reloadData] là sự nghi ngờ của tôi khi tôi đọc chủ đề. Ông đang gọi reloadData mặc dù, mà loại bỏ sau này. – barley

+0

- (NSInteger) tableView: (UITableView *) tableView numberOfRowsInSection: (NSInteger) phần { trả lại bookArray.count; } – Matt

Trả lời

1

Kiểm tra chuỗi cuộc gọi. Bạn không thể có các bản cập nhật UIKit trên bất kỳ thứ gì ngoài mainThread. Tôi nghĩ rằng connectionDidFinishLoading của bạn: được gọi trên một thread riêng biệt và đó là vấn đề ở đây.

Hãy thử

dispatch_async(dispatch_get_main_queue(), ^{ 
    [self.tableView reloadData]; 
}); 
1

Bạn cần phải xem xét những gì sẽ được trả về bởi numberOfRowsInSection (và numberOfSections) đối với trường hợp nơi không có dữ liệu để hiển thị và đối với trường hợp khi có dữ liệu để hiển thị. Mỗi khi bạn gọi reloadData, tableView sẽ gọi hai phương thức này để nhận thông tin mới nhất về nguồn dữ liệu. Nếu dữ liệu của bạn chưa được tải, thì các phương thức ủy nhiệm này sẽ báo cáo các giá trị thích hợp. Nếu dữ liệu không được tải, bạn có thể kiểm tra giá trị nil hoặc thực hiện một số kiểm tra tương tự, và sau đó trả về các giá trị thích hợp. Khi dữ liệu của bạn được tải, các phương thức ủy nhiệm sẽ trả về các giá trị dựa trên kích thước của các nội dung trong nguồn dữ liệu.

Nếu bạn chỉ cho chúng tôi mã của bạn cho các phương pháp này, ai đó có thể nhận xét về việc đây có phải là vấn đề của bạn hay không.

+0

Trong câu hỏi thứ hai, bạn có thể chỉ cần đặt tính thích hợp 'ẩn' của tableView nếu bạn biết nội dung trống. Bạn có thể làm điều này bên trong một trong các phương pháp tôi đã đề cập. Hãy nhớ bỏ ẩn nó (ẩn = NO) khi có nội dung để hiển thị. – Jim

+0

- (NSInteger) numberOfSectionsInTableXem: (UITableView *) tableView { // Trả về số phần. trả lại 1; } - (NSInteger) bảngXem: (UITableView *) tableView numberOfRowsInSection: (NSInteger) phần { trả về bookArray.count; } Tôi không có nhiều trong các phương pháp này. – Matt

+0

Tôi vừa sửa lỗi chương trình của mình, và nó gọi numberOfRowsInSection 1 lần trước khi mảng của tôi được điền dữ liệu, và nó không bao giờ được gọi lại. – Matt

1

Đó là vì cách thực hiện là, không tải bảng cho đến khi nội dung tải xuống qua webservices.

Vì điều đó không đặt đại biểu thông qua IB. Sau khi hoàn thành yêu cầu web này thiết lập các đại biểu và nguồn dữ liệu thông qua mã và sau đó gọi reloadData phương pháp.Hence chúng tôi có thể làm cho bảng chờ đợi để tải cho đến khi webcall được xử lý. Cung cấp một số chỉ số hoạt động gọn gàng của HUD tùy chỉnh trong khi dữ liệu được nạp và sẽ thực hiện công việc

+1

Vui lòng thêm nhận xét khi rút gọn –

+0

Đặt ủy quyền chỉ là tốt. Trong các phương pháp nguồn dữ liệu, anh ta nên tính đến nếu quá trình tải xuống đã hoàn tất. –

+0

"anh ấy nên tính đến nếu quá trình tải xuống đã hoàn tất". Có nghĩa? –

Các vấn đề liên quan