2016-09-15 16 views
24

Tôi chỉ cần di chuyển dự án của chúng tôi để nhanh chóng 3 và thấy rất nhiều tai nạn vì một vấn đề:Swift 3 lỗi: [_SwiftValue pointSize] selector không được công nhận gửi đến dụ

Chấm dứt ứng dụng do ngoại lệ còn tự do 'NSInvalidArgumentException', lý do : '- [_ SwiftValue pointSize]: chọn không được công nhận gửi đến dụ

lý do cho lỗi đó là lời kêu gọi:

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

những gì tôi nhận thấy là nếu tôi đúc string để NSSt và gọi boundingRectWithSize trên đó, nó sẽ ném lỗi đó. Nó cũng dường như đang xảy ra ở nhiều phần khác, ví dụ nếu tôi đã gửi một tiêu đề bộ điều khiển xem trong bảng phân cảnh, nó sẽ ném cùng một lỗi.

Bất kỳ ai gặp sự cố tương tự?

Để tạo lại vấn đề:

Tạo một dự án mới Swift 3 trong Xcode 8 và thêm dòng sau trong 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) 

Nhưng như tôi đã nói nó bị treo ở nhiều nơi khác như có vẻ như UIKit sử dụng phương pháp này trong nhiều phần

+0

Vui lòng hiển thị mã của bạn gây ra sự cố với các phần có liên quan. – OOPer

+0

Dường như nó liên quan đến việc thực hiện nội bộ của NSString – 3lvis

+0

Tôi nhận được sự cố tương tự nhưng đối với điều này: (textLabel.text! As NSString) .size (thuộc tính: fontAttributes) Tôi đã thử mọi thứ từ việc sử dụng nsmutablestring, phụ thêm dây để nó vv nó vẫn còn treo. Đây là lỗi táo không nghi ngờ gì. Thực sự rất tệ. Không thể di chuyển. – ullstrm

Trả lời

24

Nếu tôi sử dụng mã kiểm tra của bạn, nhưng hãy để kiểu dữ liệu là attributes mặc định, nó không bị lỗi. Đó là:

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

Tùy chọn nhấp vào biến nói rằng đó là [String : UIFont].

Thử nghiệm thêm một chút, gợi ý rằng nó liên quan đến đối tượng tùy chọn; [String: AnyObject] xuất hiện để hoạt động OK.

EDIT: Và sau tất cả, tôi quyết định đọc tài liệu, sử dụng [String: Any]. :)

+29

đánh bắt tốt, Phillip.Một điểm ở đây, nếu ai đó đang sử dụng phông chữ tùy chỉnh thì phông chữ sẽ không được mở: 'UIFont (tên: UIFont.lightFontName(), size: 14)! ' – Leonid

+2

Phải, vì' UIFont (name: size:) 'trả về một' UIFont? '. Bạn sẽ cần phải mở nó ra trước khi tạo mục nhập từ điển ... nhưng tốt hơn là không dùng '!' (Trừ khi các sự cố là một yêu cầu). –

+2

Đã có một vấn đề rất giống nhưng với màu sắc. 'NSForegroundColorAttributeName' đã được thiết lập với một NSColor tùy chọn (có NS-, trên macOS). trước 3.0 sẽ bị lỗi. Không phải rất hài lòng với một số xử lý tùy chọn mới. – WCByrne

1

Các cố định sau đó cho tôi:

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

Thay NSDictionary với [String: Bất kỳ] sẽ khắc phục vấn đề. 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 
} 

Và gọi nó như

lblBalanceAmount.attributedText = self.attributedString (firstText: "Balance của tôi", số tiền: "500", fontSize: newFontSize, màu: UIColor (đỏ: 41/255.0, màu xanh lục: 192/255.0, màu xanh lam: 42/255.0, alpha: 1.0))

Các vấn đề liên quan