2016-09-15 1 views
24

ich unser Projekt zügig gewandert 3 nur und wegen einer Ausgabe viele Abstürze sehen:Swift 3 Fehler: [_SwiftValue Punkt] Unbekannter Selektor an Instanz gesendet

App beenden aufgrund nicht abgefangene Ausnahme ‚NSInvalidArgumentException‘, Grund : ‚- [_ SwiftValue Punkt]: Unbekannter Selektor

der Grund für diesen Fehler der Aufruf zum Beispiel gesendet ist:

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

Was bemerkte ich, dass, wenn ich werfe String NSST klingeln und boundingRectWithSize darauf anrufen, wird es diesen Fehler werfen. Es scheint auch in vielen anderen Teilen zu passieren, zum Beispiel, wenn ich einen View-Controller-Titel in einem Storyboard gesendet habe, wirft es den gleichen Fehler.

Wer hat die gleichen Probleme?

das Problem zu reproduzieren:

Erstellen Sie ein neues Projekt Swift 3 in Xcode 8 und fügen Sie die folgende Zeile in 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) 

Aber wie ich sagte, es stürzt in vielen anderen Orten als es scheint, dass UIKit diese Methode intern in vielen Teilen verwendet

+0

Bitte zeigen Sie Ihren Code an, der das Problem mit relevanten Teilen verursacht. – OOPer

+0

Sieht aus wie es mit der internen Implementierung von NSString verwandt ist – 3lvis

+0

Ich bekomme den gleichen Absturz aber dafür: (textLabel.text! Als NSString) .size (Attribute: fontAttributes) Ich habe alles aus der Verwendung von nsmutablestring, Anhängen versucht Saiten dazu etc. es stürzt immer noch ab. Dies ist Äpfel Fehler kein Zweifel. Wirklich sehr schlecht. Kann nicht migrieren. – ullstrm

Antwort

24

Wenn ich Ihren Testcode verwenden, aber den Datentyp attributes Standard lassen, stürzt es nicht ab. Das heißt:

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

Option Klick auf die Variable sagt, es ist [String : UIFont].

Ein wenig zusätzliche Tests, deutet darauf hin, dass es sich um das optionale Objekt handelt; [String: AnyObject] scheint OK zu funktionieren.

EDIT: Und nach all dem, entschied ich mich, die Dokumentation zu lesen, die [String: Any] zu verwenden heißt. :)

+29

guten Fang, Phillip.Ein Punkt hier, wenn jemand mit benutzerdefinierter Schriftart dann sollte die Schrift ausgepackt werden: 'UIFont (name: UIFont.lightFontName(), Größe: 14)' – Leonid

+2

Richtig, weil 'UIFont! (Name: Größe:)' gibt ein ' UIFont? '. Sie müssten es vor dem Erstellen des Wörterbucheintrags auspacken ... aber vorzugsweise nicht mit '!' (Sofern keine Abstürze erforderlich sind). –

+2

Hatte ein sehr ähnliches Problem, aber mit Farbe. 'NSForegroundColorAttributeName' wurde mit einem optionalen NSColor (ja NS-, auf macOS) gesetzt. vor 3.0 das wäre ein Fehler. Nicht sehr glücklich mit einigen der neuen optionalen Handhabung. – WCByrne

1

Die feste folgenden es für mich:

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

Ersetzen NSDictionary mit [Zeichenfolge: Jeder] wird das Problem beheben. let attributes: [String: Any] = [NSFontAttributeName: UIFont.systemFont(ofSize: 14)]

0
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 es nennen wie

lblBalanceAmount.attributedText = self.attributedString (firstText: "My Balance", Menge: "500", Schrifthöhe: newFontSize, Farbe: UIColor (rot: 41/255.0, grün: 192/255.0, blau: 42/255.0, alpha: 1.0))

Verwandte Themen