2012-11-01 31 views
17

Có sự cố với một vài lượt xem bảng trong ứng dụng của tôi.Nội dung UITableViewSize

Sự cố xảy ra khi nội dung của bảng thay đổi (và do đó nội dung của chế độ xem bảng trở nên lớn hơn).

Vì một số lý do, contentSize của UITableView vẫn giữ nguyên nghĩa là tôi không thể cuộn để xem nội dung mới.

Điều này xảy ra khi một ô cụ thể lớn hơn (sau khi [tableView reloadData];) hoặc khi tôi thêm ô mới (sử dụng phương thức ủy nhiệm NSFetchedResultsController).

Có điều gì tôi cần làm cho bảngView để điều chỉnh nội dung của nóKích thước không?

Chỉnh sửa để hiển thị mã nhưng đây chỉ là soạn sẵn NSFetchedResultsController đang đại biểu ...

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller { 
    // The fetch controller is about to start sending change notifications, so prepare the table view for updates. 
    [self.tableView beginUpdates]; 
} 


- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath { 

    UITableView *tableView = self.tableView; 

    switch(type) { 

     case NSFetchedResultsChangeInsert: 
      [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade]; 
      break; 

     case NSFetchedResultsChangeDelete: 
      [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
      break; 

     case NSFetchedResultsChangeUpdate: 
      [self configureCell:(OJFPunchListCell*)[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath]; 
      break; 

     case NSFetchedResultsChangeMove: 
      [tableView deleteRowsAtIndexPaths:[NSArray 
              arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
      [tableView insertRowsAtIndexPaths:[NSArray 
              arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade]; 
      break; 
    } 
} 


- (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id)sectionInfo atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type { 

    switch(type) { 

     case NSFetchedResultsChangeInsert: 
      [self.tableView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade]; 
      break; 

     case NSFetchedResultsChangeDelete: 
      [self.tableView deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade]; 
      break; 
    } 
} 


- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller { 
    // The fetch controller has sent all current change notifications, so tell the table view to process all updates. 
    [self.tableView endUpdates]; 
} 

tôi đã thực hiện hình thức này mà trước đây trong iOS5 và chưa bao giờ có một vấn đề với nó. Dường như đây là khả năng thay đổi iOS6?

:: EDIT ::

Điều ngu ngốc về việc này là tôi có một số UITableViewControllers khác trong cùng một ứng dụng và tất cả chúng đều làm việc tốt. Tôi có thể thêm các ô mới, thêm các ô có kích thước động, thay đổi kích thước ô, v.v ... và tất cả các bảng đều cuộn đúng cách lên xuống tất cả nội dung.

Sự cố này hiện đang diễn ra trên một vài lần xem bảng mà tôi đã thêm gần đây.

:: EDIT ::

OK, chỉ cần thực hiện một số gỡ lỗi. Khi tôi lần đầu tiên đi vào Bảng Xem contentSize.height là 594.

Khi tôi sau đó thêm một mục mới và quay trở lại vào tableviewController cùng các contentSize.height là 749.

Tuy nhiên, tôi không thể cuộn để xem ô mới được thêm vào ở cuối bảngView. Nó chỉ sẽ không 'cuộn ở đó. Nó bị trả lại ở chiều cao contentSize cũ.

+0

Nếu bạn cung cấp chiều cao phù hợp với các tế bào trong 'heightForRow: atIndexPath:' nó cần được ok. Bạn đang cập nhật chiều cao khi ô được cho là lớn hơn? –

+0

Tôi không bao giờ cần sửa đổi nội dung khi thêm ô. Bạn sử dụng phương pháp nào? Chèn hàng? Bạn có thể hiển thị một số mã không? –

+0

Vâng, tôi đang đặt chiều cao đúng cách khi ô thực tế lớn hơn. Nhưng đáy của tableview không di chuyển đến nó bằng số tiền mà các tế bào đã lớn hơn. tức là nếu ô lớn hơn 50 điểm thì tôi không thể cuộn để xem 50 điểm dưới cùng của ô. Ngoài ra, bảng mà tôi đang thêm các ô mới, tất cả các ô có cùng kích thước, chỉ có nhiều ô hơn. (giống như mô hình chi tiết chính, chế độ xem bảng chính có nút + để đẩy tới bộ điều khiển để tạo mục mới sau đó được hiển thị trong chính) ô mới ở đó nhưng chế độ xem cuộn bị trả lại nên tôi không thể nhìn thấy. – Fogmeister

Trả lời

1

Tôi đã có cùng một vấn đề bằng cách sử dụng một bộ điều khiển xem tùy chỉnh với hai con VC, một là một tableview + lấy kết quả điều khiển.

Tôi sẽ nhận được điểm sau khi thêm nội dung từ một vc và quay lại bảng của tôi mà tôi sẽ không thể cuộn đến nội dung mới ở dưới cùng.

Vì vậy, trong bảng điều khiển của tôi + bộ điều khiển kết quả tìm nạp, tôi điều chỉnh kích thước nội dung dựa trên số lượng đối tượng đã tìm nạp mà tôi có, bất kể chúng xuất phát từ đâu.

Trường hợp xấu nhất là tôi không thêm bất kỳ nội dung nào khi hiển thị VC, nhưng chi phí là tối thiểu.

//In my tableview + fetched results controller class 
-(void)viewDidAppear:(BOOL)animated{ 
    [super viewDidAppear:animated]; 


    NSUInteger objCount = self.fetchedResultsController.fetchedObjects.count; 
    //My custom cell has a height of 50.0f, yours may not! 
    CGFloat tableHeight = objCount * 50.0f; 

    NSLog(@"%i objects, total height: %f",objCount,tableHeight); 

    [self.tableView setContentSize:CGSizeMake(self.tableView.contentSize.width, tableHeight)]; 

} 
+0

Đã không làm việc cho tôi. – Shailesh

20

Tôi đã gặp sự cố tương tự và kết thúc bằng giải pháp này.Tôi đang thiết lập các contentSize ngay sau khi [self.tableView endUpdates];

[self.tableView endUpdates]; 

NSLog(@"%f", self.tableView.contentSize.height); 

self.tableView.contentSize = [self.tableView sizeThatFits:CGSizeMake(CGRectGetWidth(self.tableView.bounds), CGFLOAT_MAX)]; 

NSLog(@"%f", self.tableView.contentSize.height); 

[self.tableView setContentInset:UIEdgeInsetsMake(50, 0, -50, 0)]; 
+4

Rất hay, điều này cũng phù hợp với tôi. Tôi tự hỏi tại sao Apple không cung cấp một cuộc gọi đại biểu cho khi xem bảng đã hoàn thành tải lại. – scrrr

-2

Hãy thử điều này:

tôi đã gặp với simular issue.In hoàn cảnh của tôi, tôi kéo một tableview để một bộ điều khiển giao diện tùy chỉnh, được trình bày bởi một đẩy segue.If số lượng dữ liệu cho thấy trong tableview vượt quá một số số, sau đó tôi không thể chạm vào ô ở dưới cùng của tableview.

Nhiều cách đã được thử: đặt kích thước khung hình/nội dung của chế độ xem bảng và không có cách nào hoạt động cho tôi. Nói chung, tôi tìm nguyên nhân gốc và giải quyết nó theo cách đơn giản (mặc dù không phải là duyên dáng).

Đầu tiên, nguyên nhân gốc: chế độ xem bảng được tạo bởi IB có chiều rộng lớn hơn sau đó trình điều khiển chế độ xem cha mẹ. Do đó, bất kỳ ô nào ngoài giới hạn của khung nhìn sẽ không được chạm vào. Vì vậy, giải pháp rất đơn giản: Chuyển đến StoryBoard, điều chỉnh chiều rộng của chế độ xem bảng, làm cho nó nhỏ hơn chiều rộng của chế độ xem chính. Có vẻ như nếu một chế độ xem bảng được StoryBoard tạo, bạn không thể thay đổi chế độ xem bảng frame by code.Đó là những gì tôi đã tìm thấy cho đến bây giờ. Tôi đoán đó là một lỗi của StoryBoard.

Hy vọng nó hữu ích cho bạn.

0

Tôi có tableView động với 'UITableViewAutomaticDimension'. Đã xảy ra sự cố và sau khi tải lại và kích thước nội dung bằng kích thước khung hình của nó. Sau khi tôi manualy đặt kích thước nội dung để được như kích thước bảng bounds, tất cả mọi thứ hoạt động. Tôi hi vọng cái này giúp được.

table.beginUpdates() 
table.contentSize = CGSize(width: table.bounds.width, height: table.bounds.height) 
table.endUpdates() 

Và đây là sau khi tôi thực hiện table.reloadData()