为什么会有未被捕获的例外?

时间:2015-02-05 18:15:06

标签: ios uitableview swift

我使用Swift获得了一些错误,当我尝试了其他Stack Overflow帖子中列出的解决方案时,我会收到其他错误。我得到的第一个错误是 NSForwarding:警告:类'h2.Items'的对象0x7dc4ca30没有实现methodSignatureForSelector: - 提前出现问题 无法识别的选择器 - [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)
}


        }

1 个答案:

答案 0 :(得分: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的努力,并确认这是我的应用程序真正需要的。

坦率地说,除非你参与档案或国家修复,否则如果你需要沿着那条路走下去,我会感到非常惊讶。你所关注的教程没有参与其中,我在这里看不到任何暗示这是必要的。

如果您无法找到触发此Items的{​​{1}}的非预期引用,我可能会建议您从头开始项目,看看是否可以重现该问题。如果您能够在空白项目中重现问题,请与我们分享您为解决此问题而采取的准确步骤,因为我无法重现您描述的问题。我们需要MCVE并且我无法使用到目前为止提供的代码重现您描述的问题。