2013-09-24 33 views
5

Trong iOS 6, tôi đã tạo một UITableView bằng cách sử dụng QuickDialog trong ứng dụng của mình. Nó cuộn bình thường. Khi tôi chuyển sang iOS 7, cùng một UITableView không cuộn đúng cách. Tôi có thể kéo xuống phía dưới (cuộn giấy nén) nhưng khi tôi nhả ra, nó bật lên phía trên. Tôi đã chơi với viewDidAppear để thử và chẩn đoán sự cố. Xem khối mã bên dưới.UITableView không cuộn sau khi chuyển sang iOS 7

-(void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
    NSLog(@"Content height: %f",self.quickDialogTableView.contentSize.height); 
    [self.quickDialogTableView reloadData]; 
    NSLog(@"Content height: %f",self.quickDialogTableView.contentSize.height); 
    [self.quickDialogTableView layoutIfNeeded]; 
    NSLog(@"Content height: %f",self.quickDialogTableView.contentSize.height); 
} 

Sản lượng của khối này trong iOS 7 là

Content height: 0.000000 
Content height: 836.000000 
Content height: 0.000000 

Trong khi đó, đầu ra của khối này trong iOS 6 (mô phỏng) được

Content height: 836.000000 
Content height: 836.000000 
Content height: 836.000000 

Ngoài ra để thử và chẩn đoán vấn đề, tôi thiết lập một nút sẽ kích hoạt [self.quickDialogTableView reloadData]. Bất cứ khi nào nút đó được đẩy, hành vi cuộn bắt đầu hoạt động bình thường. Sau đó, khi tôi rời khỏi chế độ xem và quay lại, quá trình cuộn không thành công nữa (cho đến khi nút được đẩy). Để rõ ràng, tôi đã cố gắng tự mình đặt một số reloadData trong chính số viewWillAppear (tức là, xóa hai dòng cuối cùng trong khối mã ở trên) và nó không sửa lại cuộn.

Tôi đang tìm manh mối về nơi tôi có thể xem xét để khắc phục sự cố. Cảm ơn trước sự giúp đỡ nào.

Trả lời

7

Được rồi, vì vậy tôi không thể tìm ra nguồn gốc của vấn đề nhưng tôi đã tìm được cách giải quyết mà tôi hy vọng sẽ giúp người khác. Hoặc ít nhất, có thể giúp người khác chỉ ra điều gì thực sự sai.

Tôi đã tạo thuộc tính được gọi là trueContentSize nơi tôi lưu trữ kích thước chính xác là gì.

-(void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
    [self.quickDialogTableView reloadData]; // Calculates correct contentSize 
    self.trueContentSize = self.quickDialogTableView.contentSize; 
} 

Sau đó, trong -viewDidLayoutSubviews Tôi sửa số contentSize theo cách thủ công.

-(void)viewDidLayoutSubviews { 
    [super viewDidLayoutSubviews]; 
    self.quickDialogTableView.contentSize = self.trueContentSize; 
} 
+0

Điều này không giống như nó sẽ làm việc, và chắc chắn đủ, nó đã không làm việc cho tôi. Tôi đang phải đối mặt với cùng một vấn đề, tuy nhiên, trong giải pháp của bạn, bạn chỉ đơn giản là lấy contentSize từ quickDialogTableView trong viewDidAppear: và sau đó gán lại nó cho contentSize của quickDialogTableView một lần nữa trong viewDidLayoutSubviews ... Tôi không hiểu nó sẽ sửa chữa như thế nào vấn đề. – Jamornh

+1

@Jamornh Đồng ý. Nó không có ý nghĩa gì cả. Tuy nhiên, nếu tôi đăng nhập 'self.quickDialogTableView.contentSize' trong' -viewDidLayoutSubviews' trước 'self.quickDialogTableView.contentSize = self.trueContentSize;' nó sẽ trở thành không. Vì vậy, một cái gì đó đang xảy ra giữa '-viewDidAppear' và' viewDidLayoutSubviews' đang thiết lập 'contentSize' thành 0. Tôi không có ý tưởng gì. Rất tiếc khi nghe tin tặc của tôi không hoạt động cho bạn. Bạn đã kiểm tra để đảm bảo rằng thuộc tính 'self.trueContentSize' tùy chỉnh của bạn đã trả về kích thước mong muốn của bạn trước khi sử dụng? –

+0

Tôi đã quản lý để khắc phục bằng cách đặt lại khung và khung giới hạn của khung nhìn theo cách thủ công, sau đó đặt lại khung của tableView để phù hợp để contentSize của tableView lớn hơn khung của nó. Dường như cuộn không hoạt động vì khung của tableView lớn hơn contentSize vì một lý do nào đó. Cám ơn phản hồi của bạn! – Jamornh

0

Đối mặt với cùng một vấn đề và giải pháp duy nhất được tìm thấy là tải lại dữ liệu trong bảng. Hy vọng rằng sẽ giúp.

1

Đây là bản sửa lỗi tạm thời hiện tại của tôi. Bất cứ ai tìm ra sửa chữa thực sự?

@interface UITableView (Extension) 
@end 

@implementation UITableView (Extension) 

- (void)setContentSize:(CGSize)contentSize { 
    if (contentSize.height != 0) { 
    [super setContentSize:contentSize]; 
    NSLog(@"set content height %f", contentSize.height); 
    } else { 
    NSLog(@"set content size zero"); 
    } 
} 

@end 
3

Chỉ cần nghĩ rằng tôi có thể ném vào hai của tôi cent ở đây ..

Cùng một vấn đề đang xảy ra với tôi. Bảng tải tiền phạt lúc đầu, nhưng điều hướng đến một màn hình khác, quay lại và chế độ xem bảng contentSize0,0 và không thể kiểm soát. Fausto của workaround không đáng tin cậy làm việc, một trong hai.

Điều gì hóa ra là trường hợp của tôi chỉ là hành động tham chiếu topLayoutGuide trong -viewWillLayoutSubviews. Làm như vậy gây ra tất cả các triệu chứng trên. Hãy dùng thử trong một dự án mới:

  1. Thiết lập bộ điều khiển chế độ xem bảng bên trong bộ điều khiển tab.
  2. Tặng cho nó 30 hàng chỉ với nội dung tĩnh.
  3. Chạy và bạn có thể cuộn. Chuyển đổi các tab, sau đó quay lại và bạn có thể cuộn.
  4. Thêm NSLog(@"%@", self.topLayoutGuide); trong -viewWillLayoutSubviews
  5. Chạy lại, bạn có thể cuộn, nhưng chuyển tab, không còn cuộn nữa.

Lạ. Âm thanh như lỗi iOS hoặc bạn không nên tham khảo topLayoutGuide trong phương pháp đó. Việc xóa bất kỳ tham chiếu nào đến thuộc tính đó sẽ khắc phục sự cố.

Chỉnh sửa: Tính đến đầu năm nay, Apple đã xác nhận qua báo cáo Radar tôi đã thực hiện đây là lỗi iOS. Đừng tham khảo topLayoutGuide cho đến khi nó được giải quyết (bất cứ khi nào nó sẽ được, heh). :)

+0

Cùng một vấn đề! Chỉ cần bình luận ra topLayoutGuide gọi làm bảng di chuyển làm việc tốt ... – Cemen

+0

Tìm thấy một workaround: Thay thế 'UITableViewController' với tùy chỉnh đồng bằng' UIViewController'. Tại đây: http://stackoverflow.com/questions/19595479/calling-toplayoutguide-breaks-scrolling-altogether – Cemen

0

Tôi gặp sự cố tương tự. Vấn đề của tôi là tôi đã đặt chiều cao rõ ràng cho chế độ xem bảng trong bảng phân cảnh. Cập nhật chế độ xem bảng của tôi để sử dụng bố cục tự động bằng cách đặt khoảng cách đến các chế độ xem ở trên/dưới đây khiến nó hoạt động cho tôi.