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