2010-05-28 33 views
9

Chế độ xem có bảng được đẩy lên màn hình và tôi muốn nó cuộn đến một hàng nhất định trong bảng trước khi màn hình thực sự hiển thị. Tôi sử dụng mã này trong khung nhìn cuối cùng.Cuộn ngay để xếp hàng trong bảng trước khi xem hiển thị

NSIndexPath *scrollToPath = [NSIndexPath indexPathForRow:5 inSection:0]; 
[theTable scrollToRowAtIndexPath:scrollToPath atScrollPosition:UITableViewScrollPositionTop animated:NO]; 

Khi tôi đặt nó trong phương pháp viewDidAppear, sau đó nó nhấp nháy một thời gian ngắn từ vị trí ban đầu của bảng (ở phía trên) vào hàng tôi muốn. Tôi không muốn nó hiển thị vị trí ban đầu. Nếu tôi đặt nó trong viewDidLoad hoặc viewWillAppear thì nó bị treo với một NSRangeException, có lẽ vì bảng chưa được thiết lập.

Tôi làm cách nào để di chuyển mà không hiển thị vị trí ban đầu?

+1

[này] (http://stackoverflow.com/questions/2289114/make-uitableview-selection-before-view-appears/2289812#2289812) và [này] (http: // stackoverflow. com/questions/2156614/how-to-start-uitableview-on-the-last-cell) có thể hữu ích. – DyingCactus

Trả lời

13

Nhờ cây xương rồng xù xì và chết vì đã chỉ cho tôi đúng hướng. Câu trả lời là để tải các bảng và cuộn trong viewWillAppear:

-(void)viewWillAppear:(BOOL)animated 
{ 
    [theTable reloadData]; 
    NSIndexPath *scrollToPath = [NSIndexPath indexPathForRow:5 inSection:0]; 
    [theTable scrollToRowAtIndexPath:scrollToPath atScrollPosition:UITableViewScrollPositionTop animated:NO]; 
} 
+1

Hãy chắc chắn đánh dấu câu trả lời của riêng bạn như được chấp nhận để những người khác đọc câu hỏi này có thể xem nhanh :) – BoltClock

+0

Điều này thật tuyệt vời cho những gì tôi cần. Chỉ có điều tôi đã làm khác nhau là tôi đã sử dụng UITableViewScrollPositionNone thay vì ScrollPositionTop để người dùng có thể xem càng nhiều bảng phía trên hàng đã chọn càng tốt. – RanLearns

+1

Điều này không hiệu quả đối với tôi vì trên các phiên bản iOS mới hơn (5 & 6), tôi không thấy khung được thiết lập bởi hệ điều hành cho đến sau khi viewWillAppear. viewWillLayoutSubviews/viewDidLayoutSubviews không được gọi cho đến sau khi viewDidAppear. – Logachu

2

Nếu tôi đặt nó trong viewDidLoad hoặc viewWillAppear sau đó nó bị treo với một NSRangeException , có lẽ vì bàn không được thiết lập được nêu ra.

Tại sao bảng chưa được thiết lập? Bạn đang thiết lập phương pháp nào?

+0

cũng được tạo trong cellforrowatindexpath – cannyboy

+1

Bạn có thể tải bảng trong dạng xemWillAppear –

1

Tôi vừa hoàn thành đấu vật với điều này. Tôi đã thêm một thanh tìm kiếm vào đầu danh sách, ban đầu được giấu dưới đầu ... ala một số ứng dụng cốt lõi. Tôi thực sự sẽ hỏi cùng một câu hỏi này!

Tôi sợ phải cung cấp điều này, vì dường như những người cung cấp mọi thứ bị đập xuống .. nhưng ... Tôi rất ngạc nhiên rằng không có giải pháp dễ dàng ... vì vậy tôi đã thực hiện việc này:

Tôi sử dụng ABTableViewCell (bạn có thể google nó) cho các ô được vẽ tùy chỉnh (đẹp và nhanh!), Và khi tôi được gọi đến DRAW hàng thứ hai (bạn có thể làm điều này trong các ô được vẽ tùy chỉnh mà không có ABTableViewCell), tôi đặt nó ở đó , với một semaphore lửa duy nhất:

if (self.mOnlyOnce == NO && theRow > 1) { 
    self.mOnlyOnce = YES; 
    [self.mParentTable scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:1] atScrollPosition:UITableViewScrollPositionTop animated:NO]; 
} 

(chọn hàng thích hợp của bạn/phần, như phù hợp với bạn ... nếu họ trong phần tương tự, bạn sẽ có thể được thiết lập hàng để một cái gì đó khác 0)

Nếu bạn ghét giải pháp của tôi (vì tôi chưa thể nhận xét), hãy làm ơn tôi chỉ để lại nó ở số & để giải pháp tốt hơn được đưa lên hàng đầu.

Ồ, ngoài ra, có mục nhập ẩn tìm kiếm của bạn ở trên cùng ... nhưng tôi đã được thực hiện dưới dạng ô tùy chỉnh ... ở đây là link.

thưởng thức

-1

trong iOS 8 trở lên [self.tableView reloadData] trong viewWillAppear trước scrollToRowAtIndexPath không làm việc, bạn phải làm tải lại trong viewDidAppear như đưa ra dưới đây:

- (void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:YES]; 

    [self.tableView reloadData]; 

    [self.tableView scrollToRowAtIndexPath:[[NSIndexPath indexPathForRow:18 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:YES]; 

} 

Lưu ý: bạn phải sử dụng UITableViewScrollPositionTop, nếu không cuộn sẽ không như mong đợi và có thể cuộn xuống dưới cùng và thậm chí để trống khu vực sau hàng cuối cùng nếu bạn chỉ định scrollToRow làm hàng cuối cùng.

Tôi nghĩ rằng trong iOS 8 trở lên lần đầu tiên tableView được tải nó không tải tất cả dữ liệu được sử dụng để xây dựng bảng, đó là lý do bạn phải sử dụng [tableView reload] mà tôi nghĩ là hơi lạ.

2

Gọi scrollToRowAtIndexPath: trong viewWillAppear: không hoạt động đối với tôi vì chưa tải tableView. Nhưng tôi có thể giải quyết vấn đề này bằng cách gọi số scrollToRowAtIndexPath: sau một thời gian trễ.

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 

    [self performSelector:@selector(scrollToCell) withObject:nil afterDelay:0.1]; 
} 

- (void) scrollToCell 
{ 
    [_tableView reloadData]; 
    NSIndexPath *scrollToPath = [NSIndexPath indexPathForRow:5 inSection:0]; 
    [_tableView scrollToRowAtIndexPath:scrollToPath atScrollPosition:UITableViewScrollPositionTop animated:NO]; 
} 

Hy vọng nó sẽ giúp ai đó.

+2

Câu trả lời này hoạt động tốt hơn nhưng thay vào đó bạn có thể sử dụng dispatch_after. – harshalb

+0

Đã thử nhiều thứ trên iOS 8 và chỉ có tác dụng này. Nhưng cũng hoạt động với 'dispatch_async' trên chuỗi chính. –

+0

độ trễ 0 cũng hoạt động tốt và trông đẹp hơn 100ms, nơi bạn vẫn sẽ thấy nó nhảy 100ms sau khi bạn đẩy bảng –

1

Bạn có thể sử dụng GCD để gửi cuộn vào lần lặp tiếp theo của vòng lặp chạy chính trong viewDidLoad để đạt được hành vi này. Cuộn sẽ được thực hiện trước khi xem bảng được hiển thị trên màn hình, vì vậy sẽ không có nhấp nháy.

- (void)viewDidLoad { 
    dispatch_async (dispatch_get_main_queue(), ^{ 
     NSIndexPath *indexPath = YOUR_DESIRED_INDEXPATH; 
     [self.tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:NO]; 
    }]; 
} 
4

tôi đã có vấn đề chính xác cùng, sau khi thử tất cả mọi thứ, điều này làm việc, chính là nếu bạn đang sử dụng autolayout, bạn phải viết mã scrollToBottom trong viewDidLayoutSubviews

khởi scrollToBottom true và sau đó làm điều này

- (void)viewDidLayoutSubviews { 
    [super viewDidLayoutSubviews]; 
    // Scroll table view to the last row 
    [self scrollToBottom]; 
} 

-(void)scrollToBottom { 
    if (shouldScrollToLastRow) 
    { 
     CGPoint bottomOffset = CGPointMake(0, self.tableView.contentSize.height - self.tableView.bounds.size.height); 
     [self.tableView setContentOffset:bottomOffset animated:NO]; 
    } } 

làm điều này sẽ đảm bảo bạn đang gần như ở dưới cùng của bạn tableView nhưng có thể không phải ở phía dưới rất là bất khả thi của nó để biết đáy chính xác bù đắp khi bạn đang ở phía trên cùng của tableView , sau đó chúng tôi có thể triển khai scro llViewDidScroll

-(void)scrollViewDidScroll: (UIScrollView*)scrollView 
{ 
    float scrollViewHeight = scrollView.frame.size.height; 
    float scrollContentSizeHeight = scrollView.contentSize.height; 
    float scrollOffset = scrollView.contentOffset.y; 

    // if you're not at bottom then scroll to bottom 
    if (!(scrollOffset + scrollViewHeight == scrollContentSizeHeight)) 
    { 
     [self scrollToBottom]; 
    } else { 
    // bottom reached now stop scrolling 
     shouldScrollToLastRow = false; 
    } 
} 
Các vấn đề liên quan