2016-09-15 34 views
24

po prostu przeniesione nasz projekt do Swift 3 i zobaczyć wiele wypadków z powodu jednej kwestii:Swift 3 error: [_SwiftValue pointSize] wybierak nierozpoznany wysyłane do instancji

Zakończenie aplikację spowodowane nieprzechwyconego wyjątku „NSInvalidArgumentException”, rozum : - [_ SwiftValue pointSize]: nierozpoznany selektor wysyłane do instancji

przyczyną tego błędu jest wezwanie do:

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

Co zauważyłem jest to, że jeśli rzucę String do NSSt zadzwoń i zadzwoń pod numer boundingRectWithSize, który wyrzuci ten błąd. Wydaje się, że dzieje się to również w wielu innych częściach, na przykład, jeśli wysłałem tytuł kontrolera widoku w storybooku, to powoduje to ten sam błąd.

Ktoś mający te same problemy?

odtworzyć problem:

Utwórz nowy Swift 3 projektu w Xcode 8 i dodaj następującą linię w 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) 

Ale jak powiedziałem to wywala w wielu innych miejscach, jak wydaje się, że UIKit używa tej metody wewnętrznie w wielu częściach

+0

Proszę pokazać kod powodujący problem z odpowiednimi częściami. – OOPer

+0

Wygląda na to, że jest to związane z wewnętrzną implementacją NSString – 3lvis

+0

Otrzymuję tę samą awarię, ale w tym przypadku: (textLabel.text! As NSString) .size (attributes: fontAttributes) Próbowałem wszystkiego, od użycia nsmutablestring, dołączając ciągi do niego itp. nadal się zawiesza. To niewątpliwie wina jabłek. Naprawdę bardzo źle. Nie można przeprowadzić migracji. – ullstrm

Odpowiedz

24

Jeśli użyję twojego kodu testowego, ale niech domyślny typ danych attributes, to się nie psuje. Czyli:

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

Option-kliknięcie na zmiennej mówi, że to [String : UIFont].

Trochę dodatkowych testów sugeruje, że są one powiązane z opcjonalnym obiektem; [String: AnyObject] wydaje się działać poprawnie.

EDIT: I po tym wszystkim, zdecydowałem się przeczytać dokumentację, która mówi, aby użyć [String: Any]. :)

+29

dobry połów, Phillip.W tym miejscu, jeśli ktoś używa niestandardowej czcionki, czcionka powinna zostać rozpakowana: 'UIFont (name: UIFont.lightFontName(), size: 14)!' – Leonid

+2

W porządku, ponieważ 'UIFont (name: size:)' zwraca ' UIFont? '. Będziesz musiał ją rozwinąć przed utworzeniem wpisu słownikowego ... ale najlepiej nie za pomocą '!' (Chyba że awarie są wymagane). –

+2

Miał bardzo podobny problem, ale z kolorem. Nazwa 'NSForegroundColorAttributeName' była ustawiana za pomocą opcjonalnego NSColor (yes NS-, on macOS). pre 3.0 to błąd. Niezbyt zadowolony z niektórych nowych opcji obsługi. – WCByrne

1

Poniżej ustalone to dla mnie:

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

Wymiana NSDictionary z [String]: Dowolny będzie rozwiązać problem. 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 
} 

i nazwać jak

lblBalanceAmount.attributedText = self.attributedString (firstText: "My Balance", kwota: "500", fontSize: newFontSize, kolor: UIColor (Czerwony: 41/255.0, zielony: 192/255.0, niebieski: 42/255.0, alfa: 1.0))