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

5

这可能是一个很傻的问题,但我无法在任何地方找到答案。 如果我想在代码中创建一个UIButton并需要设置运行时属性,那么如果不使用界面构建器严格在代码中如何实现?


什么样的属性?在按钮实例上调用一个方法... - Wain
4个回答

11

实际上我弄明白了,就像我说的那样,这是一个愚蠢的问题。

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

7
当你在界面构建器中设置一个运行时属性时,实际上你正在指示Nib加载机制在Nib加载期间调用该对象的相应setter方法。因此,如果您有一个名为“name”的运行时属性,并且其字符串值为“Bob”,这意味着在运行时的某个时刻,在Nib加载过程中,该实例的-setName:方法将被调用,并带有@"Bob"作为参数。
因此,要在运行时做同样的事情,您只需直接设置属性,例如在您的视图控制器的-viewDidLoad方法或其他适当位置:
self.button.name = @"Bob";

1
或者在视图的init或awakeFromNib中 - Ham Dong Kyun

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元素生成的事件。

-1

你需要在代码中引用UIButton(通常通过创建IBOutlet)然后就可以像在编程时创建按钮一样访问它的属性。

如果你想要以编程方式创建按钮:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接