5

这可能是一个愚蠢的问题,但我无法在任何地方找到答案。如果我想创建一个UIButtonin 代码并需要设置一个运行时属性,如果没有 interface builder 并且严格地 in 代码,我将如何做到这一点?

4

4 回答 4

11

实际上想通了,就像我说的愚蠢的问题一样。

[UIButton *loginbtn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[loginbtn setValue:@"blah" forKey:@"myAttr"];
于 2013-11-08T17:30:54.960 回答
6

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

所以,要在运行时做同样的事情,你只需直接设置属性,也许在你的视图控制器的-viewDidLoad方法中,或者其他合适的地方:

self.button.name = @"Bob";
于 2013-11-08T17:10:13.337 回答
1

想要提供一个更新的答案,它利用 Swift 属性包装器来干净地属性应该被忽略的 UI 元素。

Swift 5.1+ 属性包装器

@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!

我已经实现了这个解决方案,并在 Live View 和 Events Visualizer 中确认 Heap 忽略了由属性包装器属性的 UI 元素生成的事件。

于 2020-05-22T16:46:07.400 回答
-1

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

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

    UIButton *button = [[UIButton alloc] initWithFrame:frame];
    [button setTitle:@"Title" forState:UIControlStateNormal];
于 2013-11-08T17:07:43.377 回答