これはばかげた質問かもしれませんが、どこにも答えが見つかりませんでした。コード内でを作成しUIButton
、ランタイム属性を設定する必要がある場合、インターフェイス ビルダーを使用せずに厳密にコード内で行うにはどうすればよいですか?
4 に答える
私がばかげた質問をしたように、実際にこれを理解しました。
[UIButton *loginbtn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[loginbtn setValue:@"blah" forKey:@"myAttr"];
Interface Builder でランタイム属性を設定するとき、実際に行っていることは、Nib の読み込み中にそのオブジェクトで対応するセッター メソッドを呼び出すように Nib の読み込み機構に指示することです。したがって、たとえば「Bob」という文字列値を持つ「name」と呼ばれるランタイム属性がある場合、それは、実行時の 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!
私はこのソリューションを実装し、ライブ ビューとイベント ビジュアライザーの両方で、ヒープがプロパティ ラッパーに関連付けられた UI 要素によって生成されたイベントを無視することを確認しました。
コード内で何らかの方法で UIButton を参照する必要があり (通常は IBOutlet を作成することによって)、プログラムでボタンを作成するときと同じように、そのプロパティにアクセスできます。
たとえば、ボタンをプログラムで作成する場合:
UIButton *button = [[UIButton alloc] initWithFrame:frame];
[button setTitle:@"Title" forState:UIControlStateNormal];