2012-07-20 4 views
5

Vì vậy, tôi đang cố gắng cập nhật một ô có hình ảnh đến. Tôi có một giao thức gọi lại phương thức tương ứng khi hình ảnh DLing được thực hiện. Nguồn của UITable là một NSArray của các đối tượng "Meeting". Mỗi Hội nghị nắm giữ indexPath ô trong bảng của nó mà tôi nhận được tại một -iphone UITable reloadRowsAtIndexPaths vấn đề rất lạ

(UITableViewCell *)tableView:(UITableView *)_tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    Meeting * meeting = [tableDataSource objectAtIndex:indexPath.row]; 
... cell's init code 
    meeting.cellPath = indexPath; // also tried [indexPath copy]; 
... 
} 

vấn đề là khi tôi đang cố gắng để cập nhật di động với lưu trữ indexPath Im nhận được một lỗi lạ mà nói về một số mảng NSMutable mà tôi không có:

2012-07-20 20:15:18.007 MyNewbieApp[5734:207] meeting.cellPath = [row = 2,section = 0] 
2012-07-20 20:15:18.705 MyNewbieApp[5734:207] meeting.cellPath = [row = 4,section = 0] 
2012-07-20 20:15:18.728 MyNewbieApp[5734:207] meeting.cellPath = [row = 5,section = 0] 
2012-07-20 20:15:18.730 MyNewbieApp[5734:207] downloadDidFinishDownloading <NSIndexPath 0x79456f0> 2 indexes [0, 5] 
2012-07-20 20:15:18.732 MyNewbieApp[5734:207] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[NSMutableArray objectAtIndex:]: index 3 beyond bounds [0 .. 2]' 
*** Call stack at first throw: 
(
    0 CoreFoundation      0x02c70b99 __exceptionPreprocess + 185 
    1 libobjc.A.dylib      0x02a6540e objc_exception_throw + 47 
    2 CoreFoundation      0x02c66695 -[__NSArrayM objectAtIndex:] + 261 
    3 UIKit        0x00556327 -[_UITableViewUpdateSupport(Private) _setupAnimationsForExistingVisibleCells] + 264 
    4 UIKit        0x00555b9b -[_UITableViewUpdateSupport initWithTableView:updateItems:oldRowData:newRowData:oldRowRange:newRowRange:context:] + 436 
    5 UIKit        0x003ab5d6 -[UITableView(_UITableViewPrivate) _updateWithItems:withOldRowData:oldRowRange:newRowRange:context:] + 1323 
    6 UIKit        0x003a7f03 -[UITableView(_UITableViewPrivate) _endCellAnimationsWithContext:] + 9179 
    7 UIKit        0x003974d3 -[UITableView reloadRowsAtIndexPaths:withRowAnimation:] + 56 
    8 MyNewbieApp       0x00017354 -[MeetingsVC downloadDidFinishDownloading:] + 174 
    9 MyNewbieApp       0x000173a6 -[MeetingsVC download:didFailWithError:] + 43 
    10 MyNewbieApp       0x00010e5f -[Meeting image] + 317 
    11 MyNewbieApp       0x00016f49 -[MeetingsVC tableView:cellForRowAtIndexPath:] + 2141 
    12 UIKit        0x0039ed6f -[UITableView(UITableViewInternal) _createPreparedCellForGlobalRow:withIndexPath:] + 619 
    13 UIKit        0x00394e02 -[UITableView(UITableViewInternal) _createPreparedCellForGlobalRow:] + 75 
    14 UIKit        0x003a9774 -[UITableView(_UITableViewPrivate) _updateVisibleCellsNow:] + 1561 
    15 UIKit        0x003a17ec -[UITableView layoutSubviews] + 242 
    16 QuartzCore       0x02619481 -[CALayer layoutSublayers] + 177 
    17 QuartzCore       0x026191b1 CALayerLayoutIfNeeded + 220 
    18 QuartzCore       0x026122e0 _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 302 
    19 QuartzCore       0x02612040 _ZN2CA11Transaction6commitEv + 292 
    20 QuartzCore       0x02642ebb _ZN2CA11Transaction17observer_callbackEP19__CFRunLoopObservermPv + 99 
    21 CoreFoundation      0x02c51f4b __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 27 
    22 CoreFoundation      0x02be6b27 __CFRunLoopDoObservers + 295 
    23 CoreFoundation      0x02bafce7 __CFRunLoopRun + 1575 
    24 CoreFoundation      0x02baf350 CFRunLoopRunSpecific + 208 
    25 CoreFoundation      0x02baf271 CFRunLoopRunInMode + 97 
    26 GraphicsServices     0x0318000c GSEventRunModal + 217 
    27 GraphicsServices     0x031800d1 GSEventRun + 115 
    28 UIKit        0x0033baf2 UIApplicationMain + 1160 
    29 MyNewbieApp       0x00002034 main + 102 
    30 MyNewbieApp       0x00001fc5 start + 53 
) 
terminate called after throwing an instance of 'NSException' 

vì vậy, mảng Chỉ mục của nó nằm ngoài ngoại lệ. Bởi tôi không có bất kỳ NSMutableArray trong đó có 3 yếu tố. Tất cả các mảng của tôi r lớn hơn nhiều. À, ngoại lệ xuất phát từ đây:

- (void)downloadDidFinishDownloading:(Meeting *)meeting 
    { 
     NSLog(@"downloadDidFinishDownloading %@",meeting.cellPath); 
     //NSLog(@"downloadDidFinishDownloading meeting.cellPath = [row = %d,section = %d]",meeting.cellPath.row,meeting.cellPath.section); 

     [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:meeting.cellPath] withRowAnimation:UITableViewRowAnimationNone]; 
     meeting.delegate = nil; 
    } 

- (void)download:(Meeting *)meeting didFailWithError:(NSError *)error{ 
    [self downloadDidFinishDownloading:meeting]; 
} 

Phương thức gọi lại này được gọi mỗi lần chụp hình DLing đã được thực hiện. Và nếu tôi sẽ chỉ bình luận dòng mã với reloadRowsAtIndexPaths - mọi thứ hoạt động tốt. Nếu không, tôi sẽ gặp lỗi. Nó có thể là gì? Tôi đã dành rất nhiều giờ nhưng nó vô ích ... Tôi chỉ không có một keo tất cả những gì về ... Và những gì thậm chí còn lạ hơn vấn đề đến luôn luôn với yếu tố thứ 5 :) khi tôi di chuyển nội dung của bảng lên. Và không có gì đặc biệt với phần tử thứ 5, tôi đã thử nó với một tập dữ liệu khác nhưng vấn đề vẫn tồn tại.

cập nhật: Lỗi/sự cố chỉ xảy ra khi mã gọi lại phương thức download:(Meeting *)meeting didFailWithError. Nhưng nó vẫn có thông số cuộc họp tương tự mà tôi gửi đến downloadDidFinishDownloading. Tôi cũng đã thử theo dõi:

- (void)download:(Meeting *)meeting didFailWithError:(NSError *)error{ 
[self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:meeting.cellPath] withRowAnimation:UITableViewRowAnimationNone]; 
      meeting.delegate = nil; 
} 

vì vậy, ứng dụng hiện chỉ bị treo trong phương pháp này khi tải lạiRowsAtIndexPaths.

+0

tại sao bạn tải lại hàng nếu tải của bạn thất bại? có gì thay đổi trong hàng không? – moxy

+0

có, nó dừng lại và ẩn các spinner và làm cho có thể nhìn thấy UILabel mà nói "DL err" – Stan

Trả lời

0

Một ý tưởng là bạn có thể cần phải cập nhật đối tượng nguồn dữ liệu của bạn "tableDataSource" đặc biệt là số lượng hàng trong phần

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 

chỉnh sửa:

đọc thêm câu hỏi của bạn, bạn có thể sao chép dán "tái sử dụng ô "một phần trong cellForRowAtIndexPath (trong thực tế, toàn bộ phương pháp, tôi đoán vấn đề nằm trong đó)

+0

Nó không đạt được điều đó khi xảy ra lỗi. Nó được kiểm tra gấp đôi. Ngay sau khi ứng dụng reloadRowsAtIndexPaths gặp sự cố. – Stan

+0

Ngoài ra đối tượng nguồn dữ liệu của tôi "tableDataSource" là NSArray và nó không được cập nhật theo bất kỳ cách nào trong ý nghĩa của việc thêm hoặc loại bỏ bất kỳ phần tử nào. – Stan

0

Tôi tin rằng nguồn dữ liệu của bạn đang gặp sự cố. Với tất cả các mã khó để nói đâu là vấn đề .. Tôi đã có một mẹo cho bạn, điều đó có thể hữu ích cho bạn. Trên tab điểm ngắt trên Xcode, nhấp vào nút dấu cộng ở góc dưới bên trái và cửa sổ sẽ bật lên, nhấp vào Xong.

Chạy ứng dụng của bạn một lần nữa, bây giờ khi nó bị treo, nó sẽ chỉ cho bạn nơi trong mã ứng dụng được phá vỡ ...

Tôi không biết nếu bạn đã có nó .. nhưng vẫn còn!

+0

đối tượng nguồn dữ liệu của tôi "tableDataSource" là NSArray và nó không được cập nhật theo bất kỳ cách nào trong ý nghĩa của việc thêm hoặc loại bỏ bất kỳ phần tử nào. – Stan

+0

Bạn không thể thay đổi nội dung NSArray, thay đổi thành NSMutableArray .. và bạn đã sẵn sàng. – NSPunk

+0

Đã thử nó b4 nhưng không có gì. bên cạnh đó tôi không cố gắng thay đổi tập dữ liệu nhưng chỉ một số thuộc tính của đối tượng chứa – Stan

-1

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

[self.tableView beginUpdates]; 
[self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:meeting.cellPath] withRowAnimation:UITableViewRowAnimationNone]; 
[self.tableView endUpdates]