###はじめに
Objective-C->Swift3.0への移行作業をしていく中で、UIViewを用いたカスタムビューをダイアログのように表示しようとしています。
カスタムビュー用のクラス(以後、CustomDialog.swift)とそれ用のxibファイル(以後、CustomDialog.xib)を使い、ViewController(以後、ViewController.swift)でaddsubviewすることで表示する想定です。
その際の、CustomDialog.swiftにおけるインスタンス生成方法のベストプラクティスについて教えていただきたく思います。
###コード
・Objective-Cでの実装内容
CustomDialog.m
Objective
1- (instancetype)initWithName:(NSString *)name { 2 NSString *className = NSStringFromClass([self class]); 3 self = [[[NSBundle mainBundle] loadNibNamed:className owner:nil options:0] firstObject]; 4 5 self.dialogName = name; 6 7 return self; 8}
ViewController.m
Objective
1- (void)viewDidLoad { 2 [super viewDidLoad]; 3 4 self.customDialog = [[CustomDialog alloc] initWithName:@"hoge"]; 5 self.customDialog.frame = self.view.frame; 6} 7 8- (void)showDialog { 9 [self.view addSubview:self.customDialog]; 10}
・Swiftでの実装内容
CustomDialog.swift
Swift
1required init?(coder aDecoder: NSCoder) { 2 dialogName = "" 3 super.init(coder: aDecoder) 4} 5 6override init(frame: CGRect) { 7 dialogName = "" 8 super.init(frame: frame) 9} 10 11func setUp(frame: CGRect, name: String) { 12 13 let customDialog: UIView = Bundle.main.loadNibNamed("CustomDialog", owner: self, options: nil)?.first as! UIView 14 15 self.frame = frame 16 customDialog.frame = frame 17 dialogName = name 18 19 addSubview(customDialog) 20}
ViewController.swift
Swift
1var customDialog: CustomDialog = CustomDialog() 2override func viewDidLoad() { 3 super.viewDidLoad() 4 5 customDialog.setUp(frame: self.view.frame, name: "hoge") 6} 7 8func showDialog() { 9 self.view.addSubview(customDialog) 10}
ネットで調べながら実装したものなのですが、以下の2点が気になってしまいます。
・CustomDialog.swiftのRequired Initializerは実装必須であり、UIViewのDesignered Initializerも実装必須であるため、同じ初期化処理を2箇所でしてしまっている。
・CustomDialog.swiftクラスの[setUp:name:]メソッドの通り、ViewControllerの上にViewController.viewと同じframeの「CustomDialogそのもの」と「xibから呼び出したCustomDialog」が乗っていることになってしまう。
// 追記
修正依頼、ありがとうございました。
xibファイルは下図のような単純なもので、黒い半透明のviewの上に白いviewを乗せてダイアログのようにしているイメージです。
また、修正依頼でいただいた「Swiftだから」という点に関しては、
今までObjective-Cでは[initWithName:]という指定イニシャライザと最低限の初期化処理が記載してある[init:]メソッドのみ実装していました。
しかし、SwiftではViewControllerのCustomDialog()でDesignered Initializerが呼ばれ、[setUp:]メソッドのloadnibでRequired Initializerが呼ばれており、同じ初期化処理が2度呼ばれているということが気になってしまっています(動きとしては問題ないのですが)。
これは仕方のないことなのでしょうか。
// ----
この実装方法で問題がないのか、より良い実装方法があるのか判断できかねています。
よろしければご教授いただきたいです。

回答1件
あなたの回答
tips
プレビュー