2012-02-18 40 views
4

介紹iOS的 - 得到一個奇怪的錯誤:無法識別的選擇發送到實例上一個UITableView

在我目前的應用程序,我有持有自定義單元格對象一個UITableView。自定義的UIViewCellObjects簡單地從標準的UITableViewCell類中繼承而來。自定義單元格保存關於正在運行的後臺上傳的信息,並使用百分比完成等方式更新它們。

自定義單元對象偵聽來自在後臺運行的上傳進程的NSNotifications,當它們獲得相關通知時,它們只需使用新信息(例如上載百分比)更新其自己的視圖控件。

現在當上載過程完成後,我重新整理主動上傳對象數組並重新加載這樣的實現代碼如下:

-(void) uploadFinished: (NSNotification*)notification 
{ 
    NSDictionary *userInfo = [notification userInfo]; 

NSNumber *uploadID = [userInfo valueForKey:@"uploadID"]; 

if (uploadID.integerValue == uploadActivity.uploadID) 
{ 
    [[ApplicationActivities getSharedActivities] markUploadAsFinished:uploadActivity]; 
    [parentTable reloadData]; 

    [self setUploadComplete]; 
} 
} 

現在這種方法發生在tableviewcell對象,你可以看到他們在數組排序後立即調用他們擁有的UITableView來重新加載數據。 markUploadAsFinished方法只是重新排列數組,所以任何新完成的上傳都放在頂部,所以它會以這種方式出現在UITableView中。

的問題

現在我遇到的問題是,當這個方法被調用時,我有時得到以下錯誤: 'NSInvalidArgumentException' 的,理由是:「 - [CALayer的的tableView: numberOfRowsInSection:]:無法識別的選擇器發送到實例

我不明白這一點,有時整個過程運行良好,完成上載出現在UItableview的開始,並在其他看似隨機的時間失敗。我真的不知道這裏發生了什麼。

UploadCell *cell = [activeUploadsTable dequeueReusableCellWithIdentifier:@"UploadProgressCell"]; 

if (cell == nil) 
{ 
    [[NSBundle mainBundle] loadNibNamed:@"UploadCellView" owner:self options:nil]; 

    cell = customCell; 
} 

是否有任何人誰可能有一個關於什麼是怎麼回事線索:

定製細胞從筆尖文件中像這樣裝?

編輯

首先,我已經找到了這個錯誤在哪裏線出現右: reloadData

被稱爲自定義單元格的對象內。

此外,它似乎發送方法的實例可以更改。我也有這個錯誤:

'NSInvalidArgumentException', reason: '-[UIScrollViewPanGestureRecognizer tableView:numberOfRowsInSection:]: unrecognized selector sent to instance 

我真的不知道這裏發生了什麼。

+2

你在哪裏設置你的表視圖的'dataSource'?它在失敗時似乎被設置爲一個「CALayer」實例。 – 2012-02-18 00:52:49

+0

tableview的數據源在名爲「ActiveUploads」的.nib文件中設置。這個.nib文件只包含一個包含UItableview本身的UIView。然後將UITableView數據源+委託設置爲.nib文件的文件所有者,文件所有者是一個UIViewController,它處理您在上面看到的創建。 – CodingBeagle 2012-02-18 00:55:35

+0

您是否啓用了殭屍功能? – 2012-02-18 04:49:06

回答

6

'-[CALayer tableView:numberOfRowsInSection:]: unrecognized selector sent to instance

你有一個不好的指針。它看起來像表的數據源正在釋放,而表仍然存在。該表不保留其數據源,因爲這可能會創建保留週期。如果在表使用時不注意保留數據源,則表可以用指向不再存在的對象的指針。在這種情況下,它看起來像CALayer對象隨後被創建在相同的地址。當表稍後向其發送「數據源」消息以獲取行數時,該消息被傳遞到該層,該層(顯然)沒有-tableView:numberOfRowsInSection:方法,並且出現錯誤結果。

+0

啊哈!這就是原因!就像你說的,我確實知道原因是一個糟糕的指針,雖然我仍然無法確定其根本原因,但是這樣會清除它:)謝謝! – CodingBeagle 2012-02-18 12:23:08

0

根據我你在後臺運行上傳過程的方法,我認爲其他線程比主線程。根據我的知識,當你處理UIKIT對象時,你在主線程上已經毀了。

但是這些問題不會每次都發生,因爲有些時候你切換到其他線程主線程,所以它的工作正常,有些時候沒有。使問題發生

+0

謝謝,但我已經解決了這個問題:)只要Stackoverflow允許我回答我自己的問題,我會盡快發佈一篇文章:)這不是因爲線程安全問題,因爲底層上傳對象使用標準NSURLConnection異步方法,它將同步處理回主線程。 – CodingBeagle 2012-02-18 04:37:04

相關問題