如何解决“无法将UIViewController.Type转换为UIViewController”错误?
解决“Cannot convert value of type 'UIViewController.Type' to expected argument type 'UIViewController'”错误
这个错误的核心原因其实很直白:你把UIViewController类本身(也就是元类型UIViewController.Type)传给了需要UIViewController实例对象的参数,两者类型完全不匹配,所以编译器直接报错了。咱们一步步拆解问题和修复方案:
1. 修正DrawerView初始化的controller参数
你代码里的listBtn()是static静态方法,这时候里面的self指代的是类类型(不是实例),而且你直接传了UIViewController.self,这都是错误的。这里有两种实用的修复思路:
思路一:把方法改成非静态(推荐,除非必须用静态)
如果这个方法不需要是静态的,直接去掉static关键字,这样self就代表当前视图控制器的实例,刚好符合参数要求:
@objc func listBtn() { // 用当前VC实例self代替UIViewController.self drawerVw = DrawerView(aryControllers: DrawerArray.array, isBlurEffect: true, isHeaderInTop: false, controller: self) // 代理同样传当前实例(前提是你的VC遵守了DrawerView的代理协议) drawerVw.delegate = self as? DrawerDelegate // 替换成实际的代理协议名 }
思路二:保留静态方法,传入VC实例参数
如果必须用静态方法,那就给方法添加一个参数,让调用者传入有效的UIViewController实例:
@objc static func listBtn(from currentController: UIViewController) { drawerVw = DrawerView(aryControllers: DrawerArray.array, isBlurEffect: true, isHeaderInTop: false, controller: currentController) // 代理传入这个实例(确保它遵守代理协议) drawerVw.delegate = currentController as? DrawerDelegate } // 调用的时候,从某个VC实例里传self: // YourViewControllerClass.listBtn(from: self)
2. 修正代理赋值的问题
你代码里的drawerVw.delegate = UIViewController.self as? Dr...同样犯了把类当实例传的错误。代理属性需要的是遵守对应协议的实例对象,所以必须传一个符合要求的VC实例(比如上面的self或者currentController),同时要确保你的VC类已经声明遵守了这个代理协议,比如:
class YourViewController: UIViewController, DrawerDelegate { // 实现协议要求的方法... }
总结一下:别把Xxx.self(类本身)和Xxx的实例搞混——初始化方法和代理需要的是活生生的实例对象,不是类的类型本身。
内容的提问来源于stack exchange,提问作者Ayush Agrawal
相关产品推荐
相关产品推荐

