gpt4 book ai didi

ios - 在 Interface Builder 中使用通用类作为自定义 View

转载 作者:行者123 更新时间:2023-11-30 12:47:55 25 4
gpt4 key购买 nike

我有一个 UIButton 的自定义子类:

import UIKit

@IBDesignable
class MyButton: UIButton {

var array : [String]?

}

它是 IBDesignable,我已将其设置为 Storyboard中按钮之一的自定义类。我想使其通用,以便数组不必是 String 对象之一。所以,我尝试了这个:

import UIKit

@IBDesignable
class MyButton<T>: UIButton {

var array : [T]?

}

但是,我不确定如何将其设置为 IB 中的类(class)。我尝试输入 MyButton<String>MyButton<Int> ,但 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 运行时:尝试在 nib/storyboard 中使用带有导出/ Action 的纯 Swift 类会出现有关 ObjC 自省(introspection)的运行时错误。保持连接的导出其相应的代码声明已更改或消失会导致有关 KVC 的运行时错误。等等。)

忽略运行时问题并以稍微不同的方式表达...让我们回到 IB 需要了解的内容。请记住, Nib 加载系统是在运行时实例化 Storyboard 中的任何内容的系统。因此,即使类中采用泛型类型参数的部分不是 @IBInspectable ,nib 仍然需要知道要加载的通用类的哪些特化。因此,为了让 IB 让您使用 View 的泛型类,IB 必须有一个地方让您确定 Nib 应该使用您的类的哪种特化。事实并非如此——但这会是一个很棒的feature request .

同时,如果它对您的MyButton仍然有帮助的话类涉及一些通用存储,也许您可​​以考虑拥有 MyButton引用另一个包含通用存储的类。 (不过,它必须以这样的方式进行:在编译时不知道所述存储的类型 - 否则该其他类的类型参数将必须传播回 MyButton 。)

关于ios - 在 Interface Builder 中使用通用类作为自定义 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41388462/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com