IOS Swift получить класс по строке
Я создаю два представления. 1. ViewController по раскадровке 2. UIView новым классом. Я хочу использовать имя класса UIView: "ViewOne" для преобразования в класс, а затем загрузить этот UIView в ViewController.
код 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 ответ
Вы можете указать имя для символа в 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
....
}