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