IOS Swift получить класс по строке - PullRequest
0 голосов
/ 26 сентября 2018

Я создаю два вида.1. ViewController по раскадровке 2. UIView новым классом.Я хочу использовать имя класса UIView: «ViewOne» для преобразования в класс, а затем загрузить этот UIView в ViewController.

код контроллера представления:

override func viewDidLoad() {
    super.viewDidLoad()
    self.view.backgroundColor = UIColor.blue
    let anyobjectype : AnyObject.Type =      (NSClassFromString("TestIOSReflect.ViewOne"))!
    // TestIOSReflect is project name, ViewOne is the UIVIEW name
    let nsobjectype : NSObject.Type = anyobjectype as! NSObject.Type
    let rec: AnyObject = nsobjectype
    let currentView: UIView = rec as! UIView

    self.view.addSubview(currentView)

}

UIView: код ViewOne:

override init(frame: CGRect) {
    super.init(frame: frame)
    print("It's ViewOne")
    self.backgroundColor = UIColor.yellow
}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}
override func draw(_ rect: CGRect) {
    print("It's draw func of ViewOne")
    //self.backgroundColor = UIColor.brown
}

результат: не удалось преобразовать значение типа 'TestIOSReflect.ViewOne' (0x109bc9570) в 'UIView' (0x10c2cdab0).

Я повторяю проверку после приведенного ниже предложения:в классе ViewOne: добавьте "@objc (ViewOne)" в классе viewcontroller: удалены все приведенные ниже коды:

self.view.backgroundColor = UIColor.blue
let anyobjectype : AnyObject.Type =           (NSClassFromString("TestIOSReflect.ViewOne"))!
// TestIOSReflect is project name, ViewOne is the UIVIEW name
let nsobjectype : NSObject.Type = anyobjectype as! NSObject.Type
let rec: AnyObject = nsobjectype
let currentView: UIView = rec as! UIView
self.view.addSubview(currentView)

Заменены следующими кодами:

    if let viewOneClass = NSClassFromString("ViewOne") as? NSObject.Type{
        let ViewOne = viewOneClass.init()

        //self.view.addSubview(ViewOne)// doesn't work }

После запуска проекта: вКласс ViewOne, распечатал «It's ViewOne», но не запустил код self.backgroundColor = UIColor.yellow

1 Ответ

0 голосов
/ 26 сентября 2018

Вы можете указать имя для символа в Objective C, который пропускает пространство имен в цели C, используя аннотацию @ objc :

@objc(ViewOne)
class ViewOne: UIView {}

Затем попробуйте проверить, является ли этот класссуществует со следующим кодом:

// Variable must first be casted into a specific type
if let viewOneClass = NSClassFromString("ViewOne") as? NSObject.Type {
  // Initialization
  let viewOne = viewOneClass.init()
  //// Do your stuff
  ....
}
...