it-swarm.com.de

Swift-3-Fehler: [_SwiftValue pointSize] nicht erkannter Selektor an Instanz gesendet

Ich habe gerade unser Projekt auf Swift 3 migriert und sehe viele Abstürze wegen eines Problems:

Beenden der App wegen nicht abgerufener Ausnahme 'NSInvalidArgumentException', Grund: '- [_ SwiftValue pointSize]: nicht erkannter Selektor an Instanz gesendet

Der Grund für diesen Fehler ist der Aufruf an:

[NSAttributedString(NSExtendedStringDrawing) boundingRectWithSize:options:context:]

Was mir aufgefallen ist, ist, dass, wenn ich String in NSString umwandle und boundingRectWithSize darauf rufe, dieser Fehler ausgegeben wird. Es scheint auch in vielen anderen Bereichen zu passieren, wenn ich zum Beispiel einen View-Controller-Titel in einem Storyboard gesendet habe, wird der gleiche Fehler ausgegeben.

Hat jemand die gleichen Probleme?

Um das Problem zu reproduzieren:

Erstellen Sie ein neues Swift 3-Projekt in Xcode 8 und fügen Sie in viewDidLoad die folgende Zeile hinzu:

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)

Aber wie gesagt, es stürzt an vielen anderen Orten ab, da es scheint, dass UIKit diese Methode intern in vielen Bereichen verwendet

27
Leonid

Wenn ich Ihren Testcode verwende, aber den Datentyp attributes default zulasse, stürzt er nicht ab. Das ist:

let attributes = [NSFontAttributeName: UIFont.systemFont(ofSize: 14)]

Wenn Sie auf die Variable klicken, bedeutet dies, dass es [String : UIFont] ist.

Ein wenig zusätzliche Tests deuten darauf hin, dass es sich auf das optionale Objekt bezieht. [String: AnyObject] scheint OK zu funktionieren.

EDIT: Und nach all dem entschied ich mich, die Dokumentation zu lesen, in der [String: Any] steht. :)

24
Phillip Mills

Folgendes hat es für mich behoben:

let attributes: [String: UIFont] = [NSFontAttributeName: UIFont.systemFont(ofSize: 14)]
1
Hamza Azad
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
}

Und nennen Sie es gerne

lblBalanceAmount.attributedText = self.attributedString (firstText: "My Balance", Anzahl: "500", fontSize: newFontSize, Farbe: UIColor (Rot: 41/255.0, Grün: 192/255.0, Blau: 42/255.0, Alpha: 1.0 ))

0
Ga Ne Sh

Durch Ersetzen von NSDictionary durch [String: Any] wird das Problem behoben let attributes: [String: Any] = [NSFontAttributeName: UIFont.systemFont(ofSize: 14)]

0
EIMEI