我刚将我们的项目迁移到Swift 3,发现由于一个问题导致很多崩溃:
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[_SwiftValue pointSize]: unrecognized selector sent to instance
该错误的原因是调用了以下代码:
[NSAttributedString(NSExtendedStringDrawing) boundingRectWithSize:options:context:]
我注意到如果将String转换为NSString并调用boundingRectWithSize
,会抛出该错误。似乎在许多其他部分也发生了类似的情况,例如如果我在storyboard中发送视图控制器标题,它也会抛出相同的错误。
有人遇到相同的问题吗?
复现问题的步骤:
在Xcode 8中创建一个新的Swift 3项目,并在viewDidLoad中添加以下行:
let attributes: [String: AnyObject?] = [
NSFontAttributeName: UIFont.systemFont(ofSize: 14)
]
let boundingRect = ("hello" as NSString).boundingRect(with: CGSize(width: 100, height: 100), options: .usesLineFragmentOrigin, attributes: attributes, context: nil)
但正如我所说,它在许多其他地方都会崩溃,因为似乎UIKit在许多部分内部使用了这个方法。