dynamic - 在 Swift 中,如何使用 setValueForKey 设置对象的 textAlignment 属性?

标签 dynamic reflection swift

假设我们这样定义一个对象:

let object: AnyObject = {

    var result = UILabel(frame: CGRect(x: 0, y: 0, width: 150, height: 50))
    result.text = "First Text"
    result.backgroundColor = UIColor.blueColor()

    return result
}()

对于这个例子,我显式地创建了一个UILabel,但是在我的实际项目中我不知道创建了什么类型的对象,所以我只是把结果当作AnyObject 对于这个例子。该对象只是一个标准的 UILabel,在蓝色背景上带有“First Text”文本,默认左对齐。

在这个示例中,我知道这个对象实际上是一个 UILabel,所以我知道我可以像这样更改它的属性:

(object as UILabel).text = "Second Text"

现在我已经更改了文本。但是在我的实际项目中,我不知道我的对象是 UILabel,所以我不能只使用 (object as UILabel) 技巧,因为它不是始终是 UILabel。我的解决方法是使用 setValueForKey。在使用 respondsToSelector(未在此示例中显示)检查我的对象是否具有名为“text”的成员后,我可以这样更改文本:

object.setValue("Third Text", forKey: "text")

现在,如果我想更改对象的 textAlignment,在检查对象确实有一个名为 textAlignment 的成员后,我想做一些事情像这样:

object.setValue(NSTextAlignment.Center, forKey: "textAlignment")

这样做会导致错误:

Type 'NSTextAlignment' does not conform to protocol 'AnyObject'

我在尝试设置 frame 时遇到了类似的问题,因为它不喜欢 CGRect 类型,但我能够通过将 CGRect 转换为 NSValue。但是,我找不到一种方法来修复 enum 类型,例如 NSTextAlignment

有人知道我如何在这里实现我的目标吗?

最佳答案

你必须使用原始值 NSTextAlignment.Center.rawValue

 object.setValue(NSTextAlignment.Center.rawValue, forKey: "textAlignment")

关于dynamic - 在 Swift 中,如何使用 setValueForKey 设置对象的 textAlignment 属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27034187/

相关文章:

java - 是否可以在 Java 中批量初始化常规变量?

c# - 为什么反射可以访问 C# 中类的 protected /私有(private)成员?

swift - 如何使用分支和边界的方法解决问题?

macos - 快速识别用户是否在编辑 NSTextField 时按下了箭头键

asp.net - 如何在不对其进行硬编码的情况下使用角色 (asp.net)?

c# - 使用反射确定c#中某个类型使用的所有类型

javascript - 如何在 Marrionette 复合 View 中动态选择模型的项目 View

ios - 空 tableView 上没有结果标签

java - 使用 jQuery 和 Java 代码修改的标签属性不会保存。在ZK

linq - 将字符串作为 Linq 执行