プロジェクトをSwift 3に移行しましたが、1つの問題のために多くのクラッシュが発生しています:
キャッチされない例外「NSInvalidArgumentException」によるアプリの終了、理由:「-[_ SwiftValue pointSize]:インスタンスに送信された認識されないセレクター
そのエラーの理由は、次の呼び出しです。
[NSAttributedString(NSExtendedStringDrawing) boundingRectWithSize:options:context:]
私が気づいたのは、StringをNSStringにキャストしてboundingRectWithSize
を呼び出すと、そのエラーがスローされることです。また、他の多くの部分で発生しているようです。たとえば、ストーリーボードでView Controllerのタイトルを送信すると、同じエラーがスローされます。
同じ問題を抱えている人はいますか?
問題を再現するには:
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はこのメソッドを内部で多くの部分で使用しているように見えるため、他の多くの場所でクラッシュします
テストコードを使用しても、attributes
のデータ型をデフォルトにすると、クラッシュしません。あれは:
let attributes = [NSFontAttributeName: UIFont.systemFont(ofSize: 14)]
Optionキーを押しながら変数をクリックすると、それは[String : UIFont]
と表示されます。
少し余分なテストは、それがオプションのオブジェクトに関連していることを示唆しています。 [String: AnyObject]
は正常に機能しているようです。
編集:そしてすべての後、私は[String: Any]
を使用するという文書を読むことにしました。 :)
以下は私のためにそれを修正しました:
let attributes: [String: UIFont] = [NSFontAttributeName: UIFont.systemFont(ofSize: 14)]
func attributedString(firstText : String, amount : String, fontSize : CGFloat, color : UIColor) -> NSAttributedString {
let attrDict = [ NSFontAttributeName : UIFont(name: fontRegular, size: CGFloat(fontSize/2))!,
NSForegroundColorAttributeName : UIColor.darkGray] as [String : AnyObject]
let iconString = NSMutableAttributedString(string: firstText, attributes: attrDict)
let attrDict1 = [ NSFontAttributeName : UIFont(name: fontRegular, size: CGFloat(fontSize))!,
NSForegroundColorAttributeName : color] as [String : AnyObject]
let amountString = NSMutableAttributedString(string: amount, attributes: attrDict1)
iconString.append(amountString)
return iconString
}
そしてそれを
lblBalanceAmount.attributedText = self.attributedString(firstText: "My Balance"、amount: "500"、fontSize:newFontSize、color:UIColor(red:41/255.0、green:192/255.0、blue:42/255.0、alpha:1.0 ))
NSDictionaryを[String:Any]に置き換えると、問題が修正されます。 let attributes: [String: Any] = [NSFontAttributeName: UIFont.systemFont(ofSize: 14)]