2015-02-05 64 views
2

我收到了一些使用Swift的錯誤,並且當我嘗試了其他Stack Overflow帖子中列出的解決方案時,我收到了其他錯誤。第一個錯誤我得到的是 NSForwarding:警告:類「h2.Items」不實現methodSignatureForSelector對象0x7dc4ca30: - 麻煩了 無法識別的選擇 - [h2.Items的initWithCoder:]爲什麼會有未捕獲的異常?

那麼我已經更新了我代碼添加「NSObject」,當我這樣做時,我得到以下錯誤:

終止應用程序由於未捕獲的異常'NSInvalidArgumentException',原因:' - [h2.Items initWithCoder:]:無法識別的選擇器發送到實例0x79069250'

我不確定該從哪裏出發。我一直在下面的http://shrikar.com/blog/2015/01/17/uitableview-and-uitableviewcell-customization-in-swift/

教程,並試圖從Got Unrecognized selector -replacementObjectForKeyedArchiver: crash when implementing NSCoding in Swift

沒有人有任何其他建議解決方法?

我的代碼是:

import CloudKit 
import UIKit 
import Foundation 

class Items: NSObject 
{ 
    class Entry 
    { 
     var filename : String 
     init(fname : String) 
     { 
      self.filename = fname 
     } 
    } 

    var pics = [ 
     Entry(fname: "circle.png") 
    ] 
} 

這裏是正在調用類的代碼:

var items = Items() 

override func viewDidLoad() { 
    super.viewDidLoad() 
} 


override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 

    return 1 
} 

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 

    return items.pics.count 
} 


override func tableView(tableVIew: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as TableViewCell 

    let entry = items.pics[indexPath.row] 
    let image = UIImage(named: entry.filename) 
    cell.anotherSelfie.image = image 


    return cell 
} 

}

,這裏是該小區的代碼:

class TableViewCell: UITableViewCell { 

@IBOutlet var anotherSelfie: UIImageView! 


override func awakeFromNib() { 
    super.awakeFromNib() 

} 

override func setSelected(selected: Bool, animated: Bool) { 
    super.setSelected(selected, animated: animated) 
} 


     } 
+0

您應該顯示出現這些錯誤的代碼。 – 2015-02-05 18:20:39

+0

這是針對Objective-C的,但它解釋了無法識別的選擇器異常:http://stackoverflow.com/questions/25853947/how-can-i-debug-unrecognized-selector-sent-to-instance-error – 2015-02-05 18:23:41

+0

您定義'Items'作爲符合'NSObject'協議的類,這並不意味着它是NSObject。事實上,你在'Items'定義中定義了另一個類型。 NSObjects不能在其定義中定義其他類...以及函數,結構體,枚舉。可能這是你問題的根源。 – 2015-02-05 18:58:10

回答

2

這裏沒有什麼東西這會導致你描述的錯誤。我用你的代碼,即使沒有NSObject參考,它工作正常。問題在於其他地方。

還有一些事情還沒有與我們分享(例如,進行狀態恢復,自己呼叫NSKeyedArchiver,或許意外地將Items引用到故事板中的某些內容中)。但是,無論你在做什麼,它都試圖撥打init(coder aDecoder: NSCoder)(又名initWithCoder)。

所以,你有兩個選擇:

  • 您應該確定什麼觸發initWithCoder被稱爲這個Items對象。從那裏,你可以決定你是否真的需要經歷這個努力。

  • 如果你得出的結論是,你需要initWithCoder(也可能是encodeWithCoder,也因了什麼叫這個)​​,你可以隨身攜帶上使這個類NSCoding兼容通過實施

    init(coder decoder: NSCoder) { ... } 
    func encodeWithCoder(_ encoder: NSCoder) { ... } 
    

    看到的Encoding and Decoding Objects檔案和序列化編程指南。這是承認爲Objective-C編寫的,但這個想法在Swift中是一樣的。順便說一句,如果你得出結論認爲你確實需要製作Items兼容NSCoding,那麼很可能你也必須爲Entry做到這一點。

但我只經​​歷符合以NSCoding一旦我確定什麼需要這個的這一努力,並確認這是真正需要我的應用程序。很坦率地說,除非你從事檔案或恢復狀態,否則如果你需要走這條路,我會感到很驚訝。你所遵循的教程沒有涉及到,我在這裏看不到任何東西,這表明它在這裏是必要的。

如果您無法找到觸發此initWithCoder的意外引用Items,我可能會建議從頭開始項目並查看是否可以重現該問題。如果您能夠在空白項目中重現問題,請與我們分享您爲解決此問題而採取的確切步驟,因爲我無法重現您描述的問題。我們需要一個MCVE,我無法重現您用迄今爲止提供的代碼描述的問題。

+0

我重新創建了應用程序,按照教程一步一步,並得到完全相同的錯誤。我刪除了Xcode,然後重新安裝它以查看錯誤是否是某種錯誤。 – 2015-02-05 22:50:08

+0

隨意壓縮項目文件夾並將其上傳到某處(例如,保管箱或任何你想要的地方),我也可以看一看。我敢打賭,這將會是一件簡單的事情,現在正在逃避我們。但是,我試圖通過各種技術來重現您的錯誤,但無法完成。不過,我敢打賭,如果我們看看我們會發現它的項目。 – Rob 2015-02-05 22:53:25

+0

當我從視圖控制器的IB中刪除自定義類名稱時,應用程序啓動,但表格視圖爲空,並且在Interface Builder文件中收到未知類SelfieTableView的錯誤 – 2015-02-05 23:25:40