簡體   English   中英

在代碼中設置“用戶定義的運行時屬性”

[英]Set “User Defined Runtime Attributes” in code

這可能是一個愚蠢的問題,但我在任何地方都找不到答案。 如果我想在代碼中創建一個UIButton並且需要設置一個運行時屬性,我將如何在沒有界面構建器的情況下並且嚴格地在代碼中這樣做?

其實想通了這一點,就像我說的愚蠢的問題。

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

當您在 Interface Builder 中設置運行時屬性時,您實際上是在指示 Nib 加載機制在 Nib 加載期間調用該對象上的相應 setter 方法。 因此,如果您有一個名為“name”的運行時屬性,字符串值為“Bob”,這意味着在 Nib 加載期間的某個運行時點,實例的-setName:方法將使用@"Bob"作為論據。

所以,要在運行時做同樣的事情,你只需直接設置屬性,也許在你的視圖控制器的-viewDidLoad方法中,或者其他合適的地方:

self.button.name = @"Bob";

想要提供一個更新的答案,它利用 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 元素生成的事件。

您需要以某種方式在代碼中引用 UIButton(通常通過創建 IBOutlet),然后您可以像以編程方式創建按鈕一樣訪問其屬性。

例如,如果要以編程方式創建按鈕:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM