在代码中设置“用户定义的运行时属性”

时间:2013-11-08 17:04:42

标签: ios xcode

这可能是一个愚蠢的问题,但我无法在任何地方找到答案。如果我想在代码中创建一个UIButton并且需要设置一个运行时属性,那么如果没有接口构建器并且严格地在代码中我该怎么做呢?

4 个答案:

答案 0 :(得分:8)

实际上想出来了,就像我说的傻问题一样。

[UIButton *loginbtn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[loginbtn setValue:@"blah" forKey:@"myAttr"];

答案 1 :(得分:7)

在Interface Builder中设置运行时属性时,您实际要做的是指示Nib加载机制在Nib加载期间调用该对象上的相应setter方法。因此,如果您有一个名为“name”的运行时属性,其字符串值为“Bob”,那么这意味着在Nib加载期间的某个时刻,将使用{调用实例的-setName:方法{1}}作为论点。

因此,要在运行时执行相同的操作,您只需直接设置属性,可能在视图控制器的@"Bob"方法或其他适当的位置:

-viewDidLoad

答案 2 :(得分:1)

希望提供一个更新的答案,该答案利用Swift属性包装器来明确定义应忽略的UI元素。

Swift 5.1+ Property Wrapper

@propertyWrapper
public struct HeapIgnore<T> {
    public var wrappedValue: T {
        didSet {
            (wrappedValue as? NSObject)?.setValue(true, forKey: "heapIgnore")
        }
    }

    public init(wrappedValue: T) {
        self.wrappedValue = wrappedValue
    }
}

用法示例

... // Inside ViewController
@HeapIgnore
@IBOutlet private var passwordTextField: UITextField!

我已经实现了此解决方案,并在“实时视图”和“事件可视化工具”中都确认了Heap会忽略由属性包装器赋予的UI元素生成的事件。

答案 3 :(得分:0)

您需要以某种方式引用代码中的UIButton(通常通过创建IBOutlet),然后您可以像以编程方式创建按钮时那样访问其属性。

如果要以编程方式创建按钮,例如:

    UIButton *button = [[UIButton alloc] initWithFrame:frame];
    [button setTitle:@"Title" forState:UIControlStateNormal];