2012-04-06 46 views
6

Tôi có chế độ xem bảng tự động cuộn xuống một chút trong ứng dụng iPad của tôi (OS X 10.7.3, Xcode 4.3.2) và không chắc chắn nên tìm nguyên nhân ở đâu. Đây là tình huống:UITableView tự động cuộn xuống sau khi tải lạiData

UITableView lấp đầy toàn bộ màn hình và hầu hết các ô là ô chiều cao cố định. Một ngoại lệ là một ô có chứa một UITextView, và có chiều cao động (hoặc nói cách khác, chiều cao của ô điều chỉnh để phù hợp với số lượng văn bản).

Sự cố thể hiện chính nó nếu bảng xảy ra có ô chiều cao động bị cắt khi chế độ xem bảng ở trên cùng. Khi khung nhìn đầu tiên tải, bảng được vẽ như bình thường, chỉ với một phần của ô UITextView hiển thị. Tuy nhiên, nếu tôi hiển thị một UIPopoverController, tôi cần phải làm một reloadData sau khi popover được loại bỏ, và khi tôi làm, xem bảng sẽ di chuyển xuống chỉ đủ để hiển thị tất cả các UITextView. (Không phải ô chứa tâm trí UITextView bạn, chỉ là UITextView. Bảng này là một bảng được nhóm, và ô UITextView là ô duy nhất trong phần, do đó cạnh dưới tròn được làm tròn vẫn không hiển thị sau cuộn ma này.)

Tôi không thể thấy bất kỳ mã nào trong ứng dụng đang cuộn chế độ xem bảng hoặc đặt bù đắp nội dung, vì vậy tôi hoàn toàn bối rối về những gì có thể gây ra điều này.

Để thử và thu hẹp, tôi thiết lập chế độ xem để tôn trọng UIScrollViewDelegate và nếu tôi đặt điểm ngắt trong phương thức scrollViewDidScroll:, chương trình thực tế dừng sau khi cửa sổ bật lên biến mất và cung cấp cho tôi backtrace sau :

(lldb) bt 
* thread #1: tid = 0x1f03, 0x0005245f MyApp`-[ContactDisplayViewController scrollViewDidScroll:] + 31 at ContactDisplayViewController.m:1143, stop reason = breakpoint 3.1 
    frame #0: 0x0005245f MyApp`-[ContactDisplayViewController scrollViewDidScroll:] + 31 at ContactDisplayViewController.m:1143 
    frame #1: 0x017e3494 UIKit`-[UIScrollView setContentOffset:] + 521 
    frame #2: 0x0180804d UIKit`-[UITableView setContentOffset:] + 334 
    frame #3: 0x017d495e UIKit`-[UIScrollViewScrollAnimation setProgress:] + 523 
    frame #4: 0x0183d234 UIKit`-[UIAnimator(Static) _advance:] + 255 
    frame #5: 0x02c013a3 GraphicsServices`HeartbeatTimerCallback + 35 
    frame #6: 0x023278c3 CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 19 
    frame #7: 0x02328e74 CoreFoundation`__CFRunLoopDoTimer + 1220 
    frame #8: 0x022852c9 CoreFoundation`__CFRunLoopRun + 1817 
    frame #9: 0x02284840 CoreFoundation`CFRunLoopRunSpecific + 208 
    frame #10: 0x02284761 CoreFoundation`CFRunLoopRunInMode + 97 
    frame #11: 0x02bfe1c4 GraphicsServices`GSEventRunModal + 217 
    frame #12: 0x02bfe289 GraphicsServices`GSEventRun + 115 
    frame #13: 0x017a4c93 UIKit`UIApplicationMain + 1160 
    frame #14: 0x0000263d MyApp`main + 125 at main.m:14 

Và nếu tôi in ra scrollview trong phương pháp đó, nó cho thấy rằng UITableView đang chuyển động (không chắc chắn nơi contentOffset đến từ):

Printing description of scrollView: 
<UITableView: 0xc3ed400; frame = (0 99; 383 817); clipsToBounds = YES; 
autoresize = W+RM+H; layer = <CALayer: 0x7bf1a40>; contentOffset: {0, 14}> 

di chuyển ma này đang hiển thị trên thiết bị và trình mô phỏng và trong iOS 4.3, 5.0 và 5.1. Có ai có ý tưởng nào?

+1

Tôi có một hồi ức mơ hồ về việc nghe điều gì đó về điều này trước đây. Vì UITableViews là một lớp con UIScrollView và do đó, UITextViews nó có thể làm cho tất cả bị lộn xộn. Bạn có thể thử thay đổi một số thuộc tính trên TextView trước khi tải lại, chẳng hạn như tắt cuộn? – GregularExpressions

+0

Bạn chính xác, vô hiệu hóa cuộn trên chế độ xem văn bản trước khi reloadData giữ cho cuộn ma không xảy ra. Nếu bạn đăng bình luận của bạn như là câu trả lời, tôi sẽ chấp nhận nó. Cảm ơn. –

Trả lời

1

Tôi có một hồi ức mơ hồ về việc nghe điều gì đó về điều này trước đây. Vì UITableViews là một lớp con UIScrollView và vì vậy là UITextViews nó có thể làm cho tất cả bị lộn xộn.

Bạn có thể thử thay đổi một số thuộc tính trên TextView trước khi tải lại, chẳng hạn như tắt cuộn?

[myTextView setScrollEnabled:NO]; 
0

Tôi subclassed các UIScrollView lớp con (trong trường hợp của tôi subclassed UITextField) và chắc chắn rằng tôi không chấp nhận "tùy ý" offsets nội dung:

override var contentOffset: CGPoint { 
    set { 
     let maxContentOffsetY = max(self.contentSize.height - self.frame.size.height, 0.0) 
     super.contentOffset.y = min(newValue.y, maxContentOffsetY) 
    } 
    get { 
     return super.contentOffset 
    } 
} 
Các vấn đề liên quan