当前位置: 首页 > 面试题库 >

将通用类用作Interface Builder中的自定义视图

景建业
2023-03-14
问题内容

我有一个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<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泛型类不能在没有专门化的情况下实例化,因此尝试实例化a
MyButton而不是实例化时会出现错误MyButton<WhateverConcreteType>。)

(当您破坏其他情况时,您可以识别IB中的ObjC运行时:尝试在nib /
storyboard中使用带有出口/动作的纯Swift类会产生有关ObjC自省的运行时错误。将出口连接起来,其对应的代码声明已更改或消失会导致有关KVC的运行时错误。等等。)

要忽略运行时问题,并以稍微不同的方式进行处理…让我们回到IB需要了解的内容。请记住,笔尖加载系统是在运行时实例化情节提要中任何内容的系统。因此,即使您的类中带有泛型类型参数的部分不是@IBInspectable,笔尖仍然需要知道要加载的泛型类的什么特殊化。因此,为了使IB允许您将通用类用于视图,IB必须有一个位置供您标识笔尖应使用哪种专业。不需要-
但这会带来很棒的功能要求。

同时,如果让您的MyButton班级涉及一些通用存储仍然很有帮助,也许您可​​以考虑MyButton参考另一个包含通用存储的类。(尽管这样做的方式必须确保在编译时不知道所述存储的类型,否则其他类的类型参数必须传播回MyButton。)



 类似资料:
  • 问题内容: 有什么办法可以从类声明中引用类名称?一个例子如下: 我有一个读取此信息并进行一些设置的元类,基类实现了一些常用的保存内容。我希望能够创建像这样的递归定义,但是到目前为止,在我的实验中,我一直无法获得想要的效果,通常会遇到“未定义计划”错误。我了解发生了什么,该类的名称不在该类的范围内。 问题答案: 我有一个元类,可以读取此信息并进行一些设置 大多数使用元类的框架都提供了一种解决此问题的

  • 我试图完成的是将上下文菜单放置到在另一个视图中引用的列表框项中: 这可以很好地显示我的MyListBoxView.xaml。但是,我想知道的是,是否可以向视图添加上下文菜单:来自ListBoxPresenterView.xaml的MyListBoxView。原因是我只想让MyListBoxView.xaml尽可能通用。所以如果我想对它做任何特殊的修改,那么就让它只在引用它的类中。 所以本质上是这样

  • (在中)有一个名为的属性,它可以轻松地禁用/启用所述布局约束。 要为视图控制器创建第二个布局集,然后可以通过编程方式启用/禁用该布局集(通过两个布局集的NSLayoutConstraints的IBMoutletCollection),我需要在interface builder中禁用已定义的布局约束。 让我明确一下,我不想删除它们,只需禁用它们,这样我就可以设计第二个集合,而无需界面生成器一直抱怨约

  • 我有例外: 组织。postgresql。util。PSQLException:错误:运算符不存在:uuid=bytea 提示:没有与给定名称和参数类型匹配的运算符。您可能需要添加显式类型转换。 我有JPA实体 Id类 此外,转换器: 看起来,转换器根本不工作(我在转换器方法中设置了断点,但什么也没发生,调试器并没有进入那个里)。

  • 还有人觉得这有点令人沮丧或有什么建议吗?从基类中膨胀相同的布局似乎并不罕见。

  • 问题内容: 我已经创建了一个UserType(请参见下文)来处理mySQL数据库中的一种情况,在该情况下我们将空日期保存为0000-00-00 00:00:00。 当我尝试使用dispDT的null持久化我的实体时(请参见下文),它将生成以下异常:“ javax.persistence.PersistenceException:org.hibernate.PropertyValueExceptio