2009-04-30 29 views
22

Tôi có một ứng dụng có UITableView. UITableView này được điền bởi một NSMutableArray được giữ (như là một thuộc tính) trong appDelegate. Bạn có thể coi đây là một cửa sổ email. Nó liệt kê các tin nhắn trong một UITableViewCell được phân lớp. Khi một thông báo mới xuất hiện, tôi có tất cả các mã được thực hiện để tải xuống thư, thêm dữ liệu vào NSMutableArray của ứng dụngDelegate chứa tất cả thư. Mã này hoạt động tốt.Có gì với [UITableView reloadData]?

Bây giờ, khi thư mới được tải xuống và thêm vào mảng, tôi đang cố cập nhật UITableView của mình bằng mã sau, tuy nhiên - chức năng ủy nhiệm của UITableView không được gọi.

Điều kỳ lạ là khi tôi cuộn UITableView lên và xuống, các phương thức đại biểu cuối cùng cũng được gọi và phần đầu của tôi DO thay đổi (chúng hiển thị số lượng tin nhắn cho phần đó). Không phải họ cập nhật trong thời gian thực và không đợi cho cuộn của tôi kích hoạt làm mới? Ngoài ra, ô mới không bao giờ được thêm vào trong phần !!

Xin vui lòng trợ giúp !!

appdelegate Mã sản phẩm:

[self refreshMessagesDisplay]; //This is a call placed in the msg download method 

-(void)refreshMessagesDisplay{ 
    [self performSelectorOnMainThread:@selector(performMessageDisplay) withObject:nil waitUntilDone:NO]; 
} 

-(void)performMessageDisplay{ 
    [myMessagesView refresh]; 
} 

UITableViewController Code:

-(void) refresh{ 
    iPhone_PNPAppDelegate *mainDelegate = (iPhone_PNPAppDelegate *)[[UIApplication sharedApplication] delegate]; 

    //self.messages is copied from appDelegate to get (old and) new messages. 
    self.messages=mainDelegate.messages; 

    //Some array manipulation takes place here. 

    [theTable reloadData]; 
    [theTable setNeedsLayout]; //added out of desperation 
    [theTable setNeedsDisplay]; //added out of desperation 
} 
+2

Dude tôi cảm thấy nỗi đau của bạn, cùng một vấn đề ở đây. –

Trả lời

29

Là một kiểm tra sanity, bạn đã xác nhận rằng theTable không phải là con số không vào thời điểm đó?

+0

theTable không phải là không, nhưng bây giờ bạn đề cập đến nó, nó hiển thị như địa chỉ 0x0. IBOutlet theTable được liên kết với điều khiển trong IB, và bảng vẫn hiển thị thông qua toàn bộ quá trình này .... – Dutchie432

+7

0x0 thực sự là nil-- xem bảng tồn tại tất nhiên, nhưng con trỏ của bạn đến bảng chưa được đặt chính xác. Kiểm tra kỹ nib của bạn. –

+0

Đó chắc chắn là vấn đề rồi. Đối với một số lý do (không thể nói mà không nhìn thấy tất cả các mã) biến 'theTable' của bạn là nil, vì vậy thông điệp reloadData không đi đâu cả. – smorgan

0

Bạn đã thử đặt điểm ngắt trong phương pháp làm mới của mình chỉ để đảm bảo mảng thư của bạn có nội dung chính xác trước khi gọi lại reloadData?

+0

Có. Phương pháp đó đã được xem xét nhiều lần. Tôi có thể thấy số lượng Array tăng, và thậm chí có thể nhìn thấy đối tượng mới của tôi (message) trong trình gỡ rối với tất cả các giá trị thích hợp. – Dutchie432

12

Bạn có thể thử đặt thời gian tải lại cuộc gọi lạiData - Tôi gặp sự cố tương tự khi tôi cố gắng cập nhật bảng khi sắp xếp lại ô, ngoại trừ ứng dụng bị lỗi nếu tôi gọi reloadData trong đó.

Vì vậy, một cái gì đó như thế này có thể là đáng thử:

phương thức Refresh:

- (void)refreshDisplay:(UITableView *)tableView { 
    [tableView reloadData]; 
} 

và sau đó gọi nó với (nói) một 0,5 giây chậm trễ:

[self performSelector:(@selector(refreshDisplay:)) withObject:(tableView) afterDelay:0.5]; 

Hy vọng nó hoạt động ...

+0

+1 để làm việc như sự quyến rũ –

+0

+1 điều này cũng làm việc cho tôi. Holla! –

+0

Đây cũng là vấn đề của tôi. Tôi đang tải lại dữ liệu từ bên trong bộ chọn thông báo NSNotificationCenter. – NathanAldenSr

6

Nếu bạn gọi reloadData từ bên trong phương thức được gửi đi, hãy đảm bảo thực hiện nó o n hàng đợi chính.

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0), ^(void) { 

    // hard work/updating here 

    // when finished ... 
    dispatch_async(dispatch_get_main_queue(), ^(void) { 
     [self.myTableView reloadData]; 
    }); 
}); 

..same trong form method:

-(void)updateDataInBackground { 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0), ^(void) { 

     // hard work/updating here 

     // when finished ... 
     [self reloadTable]; 
    }); 
} 

-(void)reloadTable { 
     dispatch_async(dispatch_get_main_queue(), ^(void) { 
      [myTableView reloadData]; 
     }); 
} 
+1

Bingo! Tôi đã cập nhật trên một chủ đề nền, mà không có gì. Cảm ơn. – nont

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