2012-01-18 17 views
11

Tôi gặp lỗi khi sử dụng ứng dụng của tôi đã sử dụng tính năng xem bảng, lỗi trông giống như thế này.lỗi với scrollToRowAtIndexPath

2012-01-19 10:19:51.442 bcode[1176:207] *** Terminating app due to uncaught exception 'NSRangeException', reason: '-[UITableView scrollToRowAtIndexPath:atScrollPosition:animated:]: row (3) beyond bounds (3) for section (0).' 
*** First throw call stack: 
(0x16c3052 0x1920d0a 0x166ba78 0x166b9e9 0x68a136 0x3bfdf 0x6c2fbf 0x6c32d4 0x6c35d7 0x6d2666 0x87890e 0x878c17 0x878c86 0x62c499 0x62c584 0x2718e00 0x13614f0 0x15fa833 0x15f9db4 0x15f9ccb 0x1d05879 0x1d0593e 0x5fba9b 0x2838 0x2795 0x1) 
terminate called throwing an exception(gdb) 

Điều xảy ra là khi người dùng thực hiện chế độ xem điều hướng, họ có thể chọn ô từ chế độ xem bảng của từng chế độ xem, sau này sẽ được sử dụng để tạo chuỗi tìm kiếm.

Tuy nhiên tôi cho phép họ quay trở lại và thay đổi lựa chọn của họ nếu họ đã xảy ra lỗi .. lỗi này xảy ra khi người dùng thay đổi giá trị của chế độ xem gốc sau đó chuyển sang chế độ xem phụ chỉ khi lựa chọn trước nằm ngoài số các mục nhập trong bảng nhìn hiện tại ..

bình thường, đây không phải là vấn đề lớn, bên trong viewDidAppear Tôi đang gọi một phương thức cuộn đến ô đã chọn trước đó. lỗi.

- (void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; 
    //Scroll to previously selected value 
    [self.tableView scrollToRowAtIndexPath:oldCheckedIndexPath atScrollPosition:UITableViewScrollPositionMiddle animated:YES]; 
} 

làm thế nào tôi có thể ngăn chặn điều này thực hiện Tôi đã thử khoảng 100 indexpaths nếu statments trong giao diện phụ huynh và các subview bắt indexPath mới và agains kiểm tra oldselected khác nhau sau đó thiết lập

oldCheckedIndexPath = nil; 

Tuy nhiên bằng cách nào đó nó luôn luôn quản lý để mess lên anyway.

Trả lời

23

Cách sạch, giả sử self là nguồn dữ liệu tableView:

Kiểm tra số bộ phận trong tableview:

if ([self numberOfSectionsInTableView:self.tableView] 
            > oldCheckedIndexPath.section 

và kiểm tra số lượng hàng trong phần đó:

&& [self tableView:self.tableView numberOfRowsInSection: 
      oldCheckedIndexPath.section] > oldCheckedIndexPath.row) 
    { 
     [self.tableView scrollToRowAtIndexPath: // etc etc etc 

Hoặc, hack nhanh:

@try { 
    [self.tableView scrollToRowAtIndexPath: // etc etc etc 
} 
@catch (NSException *e) 
{ 
    NSLog(@"bummer: %@",e); 
} 
+0

oh yes !!! cant belive Tôi không nghĩ về điều đó .. whicked !! làm việc hoàn hảo! lol Tôi đã thành thật đã được kệ bộ não của tôi trong 5 giờ qua cố gắng để crack này! hoàn hảo! Cảm ơn nhiều! –

+3

+1 Dành cho NSLog hài hước! BTW @ C.Johns không sử dụng phương pháp try ... catch - đó là thực hành cực kỳ tồi tệ (ít nhất là trong C - Java là một vấn đề hoàn toàn khác ...). – jrtc27

+0

haha ​​yea Tôi đã cười vào điều đó .. @ jrtc27, yea tôi đã đi với tuyên bố đúng nếu được xây dựng ... nó hoạt động hoàn hảo. –

1

Tôi đã giải quyết nó qua một tùy chọn khác trước khi gọi scrollToRowAtIndexPath: phương thức này sẽ tải lại chế độ xem bảng của bạn như [yourtableviewobject reloadData]; và sau đó gọi NSIndexPath *scrollIndexPath = [NSIndexPath indexPathForRow:([messages count] - 1) inSection:0]; [objTableView scrollToRowAtIndexPath:scrollIndexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES];

1

Lấy cảm hứng từ câu trả lời được chấp nhận:

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0]; 
if ([self numberOfSectionsInTableView:self.tableView] > indexPath.section && [self tableView:self.tableView numberOfRowsInSection:indexPath.section] > indexPath.row) { 
    [self.tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:YES]; 
}