[解決済み] SwiftでnibからUIViewを読み込む
2022-04-23 12:34:47
質問
以下は、カスタマイズされたnibを読み込むために使用しているObjective-Cのコードです。
UIView
:
-(id)init{
NSArray *subviewArray = [[NSBundle mainBundle] loadNibNamed:@"myXib" owner:self options:nil];
return [subviewArray objectAtIndex:0];
}
Swiftで同等のコードとは?
どのように解決するのですか?
オリジナルソリューション
- XIB と SomeView という名前のクラスを作成しました(同じ名前を使用するため)。 利便性と可読性)。両方ともUIViewをベースにしています。
- XIBで、"File's Owner"クラスをSomeViewに変更しました(アイデンティティインスペクタで)。
- SomeView.swift で UIView アウトレットを作成し、XIB ファイルのトップレベルのビューにリンクしました(便宜上 "view" と名付けました)。その後、必要に応じてXIBファイル内の他のコントロールに他のアウトレットを追加しました。
- SomeView.swiftの中で、"init with code"のイニシャライザーの中でXIBをロードしています。self"に何かを代入する必要はありません。XIBがロードされるとすぐに、トップレベルビューを含むすべてのアウトレットが接続されます。唯一欠けているのは、ビュー階層にトップビューを追加することです。
.
class SomeView: UIView {
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
NSBundle.mainBundle().loadNibNamed("SomeView", owner: self, options: nil)
self.addSubview(self.view); // adding the top level view to the view hierarchy
}
...
}
この方法では、nibから自分自身をロードするクラスが得られることに注意してください。そうすれば、プロジェクトでUIViewが使われるときはいつでも(インターフェースビルダーやプログラムで)、SomeViewをクラスとして使うことができます。
更新 - Swift 3 の構文を使用
以下の拡張機能のxibの読み込みは、インスタンスメソッドとして記述し、上記のようなイニシャライザで使用することができます。
extension UIView {
@discardableResult // 1
func fromNib<T : UIView>() -> T? { // 2
guard let contentView = Bundle(for: type(of: self)).loadNibNamed(String(describing: type(of: self)), owner: self, options: nil)?.first as? T else { // 3
// xib not loaded, or its top view is of the wrong type
return nil
}
self.addSubview(contentView) // 4
contentView.translatesAutoresizingMaskIntoConstraints = false // 5
contentView.layoutAttachAll(to: self) // 6
return contentView // 7
}
}
- すべてのアウトレットがすでに接続されている場合、返されたビューは呼び出し元にとってほとんど興味がないため、廃棄可能な戻り値を使用します。
- このメソッドは、オプションの UIView 型のオブジェクトを返す汎用メソッドです。ビューの読み込みに失敗した場合は、nil を返します。
- 現在のクラスインスタンスと同じ名前の XIB ファイルをロードしようとします。これに失敗した場合、nil が返されます。
- ビュー階層にトップレベルのビューを追加する。
- この行は、ビューをレイアウトするために制約を使用していることを想定しています。
- このメソッドは、top, bottom, leading & trailing constraints - attaching view to "self" on all sides (参照)を追加します。 https://stackoverflow.com/a/46279424/2274829 詳細はこちら)
- トップレベルのビューを返す
そして、呼び出し側のメソッドは次のようなものになります。
final class SomeView: UIView { // 1.
required init?(coder aDecoder: NSCoder) { // 2 - storyboard initializer
super.init(coder: aDecoder)
fromNib() // 5.
}
init() { // 3 - programmatic initializer
super.init(frame: CGRect.zero) // 4.
fromNib() // 6.
}
// other methods ...
}
- SomeClass は、SomeClass.xib ファイルからそのコンテンツをロードする UIView のサブクラスです。final" キーワードはオプションです。
- ビューがストーリーボードで使用されるときのためのイニシャライザーです(ストーリーボードビューのカスタムクラスとしてSomeClassを使用することを忘れないでください)。
- プログラムによりビューを作成する場合のイニシャライザー (例: "let myView = SomeView()").
- このビューはオートレイアウトでレイアウトされているため、オールゼロフレームを使用しています。 init(frame: CGRect) {...}"メソッドは独立して作成されないことに注意してください。
- & 6.拡張子を使ってxibファイルを読み込む。
クレジット:このソリューションで一般的な拡張子を使用することは、以下のRobertの回答からヒントを得ました。
編集 混乱を避けるため、"view" を "contentView" に変更しました。また、配列の添え字を".first"に変更。
関連
-
[解決済み] ペン先を読み込んだが、「表示」コンセントが設定されていない
-
[解決済み] Swift presentViewController
-
[解決済み] Error: this class is not key value coding-compliant for key tableView.' [重複] を修正する方法。
-
[解決済み] 使用しているSwiftのバージョンを確認するにはどうすればよいですか?
-
[解決済み] Fatal error.とは何ですか?Unexpectedly found nil while unwrapping an Optional value" とはどういう意味ですか?
-
[解決済み] SwiftからObjective-Cのコードを呼び出すにはどうしたらいいですか?
-
[解決済み] SwiftでUIAlertViewを作成するにはどうしたらいいですか?
-
[解決済み] 2倍値を小数点以下x桁に丸める処理を素早く行う。
-
[解決済み】Swiftの列挙型と関連する値の等質性をテストする方法
-
[解決済み】Swiftで弱参照の配列を宣言するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Xcode 8 シェルスクリプト呼び出しエラー
-
[解決済み] iPhone Simulator.appと一緒にXcodeも外付けハードディスクにインストールできますか?
-
[解決済み] swiftの"? "の意味は何ですか?[重複している]。
-
[解決済み] SwiftでString.Indexはどのように動作するのか
-
[解決済み] Swiftベースのアプリケーションは、OS X 10.9/iOS 7以下でも動作しますか?
-
[解決済み】Swiftの辞書にキーが含まれているかどうかを判断し、その値を取得する。
-
[解決済み】swift 4でenumをDecodableにするにはどうすればいいですか?
-
[解決済み】コンパイラーエラー。Objective-C のセレクタを持つメソッドは、同じ Objective-C セレクタを持つ以前の宣言と競合しています。
-
[解決済み】なぜ、Swiftの文字列では、?のような絵文字が奇妙に扱われるのですか?
-
[解決済み] Swift で XIB ファイルを使用してカスタム UIView クラスを初期化/インスタンス化する方法