2010-01-14 33 views
13

Tôi có một UITableView với một số nguồn dữ liệu. Điều này là do, tôi cần phải chuyển đổi dữ liệu với một UISegmentedControl, và nếu tôi thêm chúng như subviews, tôi không thể sử dụng Statusbar để cuộn lên vvUITableView không hoạt động bình thường sau khi thay đổi dữ liệuSource

Lúc đầu, tôi thấy một màn hình đăng nhập:

self.tableView.dataSource = loginTableView; 
self.tableView.delegate = loginTableView; 
[self.tableView reloadData]; 

sau đó, khi người dùng đã đăng nhập, tôi làm như sau để thay đổi chỉ số: 1 của segmentedControler, đó là hồ sơ của họ:

self.tableView.dataSource = profileTableView; 
self.tableView.delegate = profileTableView; 
[self.tableView reloadData]; 

Tuy nhiên, các bản cập nhật xem bảng, nhưng là một chút một kết hợp giữa hai dataSources. Một số văn bản đã thay đổi, một số văn bản bị chồng chéo, trong khi một số văn bản bị thiếu hoàn toàn.

Có cách nào khác tôi nên thay đổi dataSource cho UITableView không?

Thx

Trả lời

4

Không chắc chắn tại sao điều này xảy ra từ mã bạn đã đăng.

Thay vì thay đổi các đại biểu và nguồn dữ liệu, trao đổi ra bất cứ điều gì Ivar đại diện cho dữ liệu được hiển thị:

- (NSArray*)tableData{ 

    if(showingLogin) 
     return self.loginData; 

    return self.profileData; 
} 

Bây giờ bạn chỉ có 1 UITableViewController dụ, nhưng một BOOL để cho bạn biết nguồn dữ liệu để sử dụng.

0

Chà, thật kỳ quặc.

Lần cuối cùng tôi làm điều gì đó như thế này, tôi chỉ đơn giản sử dụng nhiều chế độ xem, ẩn một chế độ xem và hiển thị một lượt xem khác khi điều khiển được phân đoạn được khai thác. Có những giải pháp khả thi khác, nhưng điều này có lẽ là dễ nhất và có lẽ hiệu quả nhất.

+0

Yeah, tôi đã làm điều này, nhưng sau đó bạn không thể cuộn lên qua statusBar và tôi đã gặp sự cố khi đẩy chế độ xem. – runmad

2

Chế độ xem bảng đang lưu trong bộ nhớ cache các ô nội bộ mà nó sử dụng để hiển thị dữ liệu của bạn. Vì vậy, nếu bạn thay đổi nguồn dữ liệu, bạn cũng nên kiểm tra xem bảng của bạn - (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) phương pháp indexPath đang cập nhật tất cả các ô với giá trị mới chính xác.

Từ mô tả của bạn, có vẻ như nó đang sử dụng các phiên bản UITableViewCell được lưu trong bộ nhớ cache và không cập nhật dữ liệu mới chính xác trong mọi trường hợp. Có lẽ mã như thế này:

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

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) 
    { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
     cell.frame = CGRectZero; 
     cell.textLabel.font = //Set font; 
     cell.selectionStyle = UITableViewCellSelectionStyleNone; 
     cell.textLabel.text = @"My Text for this cell"; // <==== Not good! Move it out of this if block 
    } 
    // Set cell text here 
} 

Giải pháp đơn giản nhất tôi tìm thấy loại vấn đề này là chỉ tạo String bạn sử dụng để tạo ô (CellIdentifier) ​​tùy thuộc vào nguồn dữ liệu. Trong trường hợp này, bạn không kết hợp ô của các loại nội dung khác nhau (và điều này cũng giúp bạn nếu các ô cần phải có giao diện khác tùy thuộc vào chế độ).

9

Tôi gặp vấn đề tương tự. Giải pháp của tôi là làm cho tableView bị ẩn, thay đổi nguồn của nó, tải lại dữ liệu và làm cho tableView hiển thị trở lại.

Ví dụ trong C# (MonoTouch):

tableView.Hidden = true; 
tableView.Source = newTableViewSource; 
tableView.ReloadData(); 
tableView.Hidden = false; 
+0

Cảm ơn bạn rất nhiều vì bài viết của bạn, tôi đã phải vật lộn để thay đổi nguồn dữ liệu trong nhiều tháng! – TChadwick

0

Tôi có cùng một vấn đề và những gì bạn phải làm là sử dụng một định tế bào khác nhau trong vòng - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath.

if (self.segmentedControl.selectedSegmentIndex == 0) { 
    self.cellIdentifier = @"segmentOne"; 
} else { 
    caseAtIndexPath = [self.awaitingReviewCaseList caseAtIndex:indexPath.row]; 
    self.cellIdentifier = @"segmentTwo"; 
} 
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:self.cellIdentifier forIndexPath:indexPath]; 
1

tôi đã vấn đề này, hóa ra đó là vì CellIdentifiers của tôi là như nhau ...

static NSString *CellIdentifier = @"Cell"; 

Thay đổi một trong số họ và các tế bào bố trí đúng

static NSString *CellIdentifier2 = @"Cell2"; 
Các vấn đề liên quan