ios – 在Interface Builder中使用通用类作为自定义视图

前端之家收集整理的这篇文章主要介绍了ios – 在Interface Builder中使用通用类作为自定义视图前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个UIButton的自定义子类:
import UIKit

@IBDesignable
class MyButton: UIButton {

    var array : [String]?

}

它是IBDesignable,我已经将其设置为我的故事板中的其中一个按钮的自定义类.我想使它成为通用的,因此数组不一定是String对象之一.所以,我试过这个:

import UIKit

@IBDesignable
class MyButton<T>: UIButton {

    var array : [T]?

}

不过,我不确定如何将此设置为IB中的班级.我试着把MyButton< String>或MyButton∬但是Interface Builder只是删除尖括号部分并获得以下编译错误

Command /Applications/Xcode6-Beta4.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift Failed with exit code 254

有没有办法使用通用的自定义类,还是不支持

解决方法

Interface Builder通过ObjC运行时“与您的代码通讯”.因此,IB只能访问在ObjC运行时可以表示的代码的特征. ObjC不做泛型,所以没有办法让IB告诉运行时你使用泛型类的专业化. (和Swift通用类不能实例化没有专门化,所以你收到一个错误尝试实例化MyButton而不是MyButton< WhateverConcreteType>).

(当您打破其他事情时,您可以在IB工作中识别ObjC运行时:尝试在笔尖/故事板中使用具有插座/动作的纯Swift类,提供有关ObjC内省的运行时错误.保留相应代码声明已更改的插座或离开给出关于KVC的运行时错误.等等)

忽略运行时问题,并以略有不同的方式让我们回到IB需要知道的内容.记住,笔尖加载系统是在运行时实例化故事板中的任何东西.所以即使你的类的部分采用通用类型参数也不是@IBInspectable,所以笔尖仍然需要知道你的泛型类的特殊化要加载.所以,对于IB,让你使用泛型类进行查看,IB必须有一个地方可以确定你的班级应该使用哪个专业化的地方.它不 – 但这会使一个伟大的feature request.

在此期间,如果您的MyButton类仍然有助于涉及一些通用存储,那么也许您可以查看MyButton引用另一个包含通用存储的类. (它必须这样做,尽管在编译时不知道所述存储的类型 – 否则该另一个类的类型参数必须传播回MyButton.)

猜你在找的iOS相关文章