2017-03-07 1 views
2

プロパティを持つView Controllerがあります。ストーリーボードでセグを使用すると、オプションのプロパティではないビューコントローラが作成されますか?

class GameVC: UIViewController { 

    var game:Game? 
    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 
} 

ビューコントローラには、ゲームプロパティが必要です。この理由から、私はそのプロパティをオプションにしないようにしたい(私はそれを使っているときに、それをアンラッピングする必要もない方がいいです)。

私は現在、この前にVCのsegueの準備とゲームプロパティの設定をオーバーライドしています。私は確かにセグやストーリーボードを使いたいからです。とにかく、このビューコントローラにカスタムinitがあり、まだseguesとstoryboardsを使用させることができますか?

+1

カスタムのinitを使用することはできませんが、暗黙のうちに開封されたオプションのプロパティを行うことができます 'VARゲーム:!ゲーム'。この方法では、使用する前に展開する必要はありませんが、使用するとクラッシュして、それがnil以外の値に設定される前にクラッシュします。 – dan

答えて

0

いいえ、ストーリーボード(およびXIBファイル)はinit?(coder:)を使用して要素をインスタンス化しますが、このinitに追加のパラメータを渡すことはできません。

一般的な方法は、暗黙の開封されたoptionalsを使用している:

var game:Game! 

この道を、あなたは非オプションのプロパティのようにそれを使用することができ、そして前に使用して設定されていない場合、それは実行時にクラッシュします。

prepare(for:sender:)にこのプロパティを設定すると、viewDidLoadに準備されているので、安全に使用できます。私のアプリで

+0

合意しましたが、オプションである必要があります。そうしないと、コンパイラはinitメソッドで値を割り当てるよう強制します。 –

+1

@DuncanC暗黙のうちにアンラップされたオプションなので、initに値を代入する必要はありません – Paulw11

0

、私はちょうどそれがnilになることはありませんし、私はセグエ前に私が値を設定することができる方法

var game = Game()

のようなものを使用。

1

はい。宣言で

初期化:あなたは2つの選択肢があり

class GameVC: UIViewController { 
    let game = Game() 

init(coder:)またはawakeFromNibを実装します。

class GameVC: UIViewController { 
    let game : Game 
    required init?(coder aDecoder: NSCoder) { 
     self.game = Game() 
     super.init(coder:aDecoder) 
    } 
0

私の意見ではストーリーボードを使用する場合に依存性の注入のための良い方法はありません。私はストーリーボードはオブジェクト指向の設計原則に反していると思います。チームのソフトウェア開発では、プロトタイピングを除いて、私はそれらの使用をお勧めしません。

代わりに、私は単純なxibファイルを使用して、画面(別名UIViewController)をできるだけ独立させようとします。また、UIViewController(ビューツリーの構築/管理)の主な目的からアニメーションナビゲーションを分離するために、独自のワイヤフレームクラスの画面間でナビゲーションを実装しています。インタフェースビルダーを使用する利点を完全に失うことなく、必要なオブジェクトを注入することが可能です。

例:

final class MyViewController: UIViewController { 

    convenience override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) { 
     self.init() 
    } 

    convenience required init(coder aDecoder: NSCoder) { 
     self.init() 
    } 

    convenience init() { 
     fatalError("Not supported!") 
    } 

    init(viewModel: ViewModel, wireframe: Wireframe) { 
     self.viewModel = viewModel 
     self.wireframe = wireframe 
     super.init(nibName: "MyViewController", bundle: Bundle(for: type(of: self))) 
    } 

    private let viewModel: ViewModel 
    private let wireframe: Wireframe 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // do something with viewModel 
    } 

    @IBAction func close() { 
     wireframe.close() 
    } 

} 

let wireframe: Wireframe = ConcreteWireframe() 
let viewModel: ViewModel = ConcreteViewModel() 
let screen: UIViewController = MyViewController(viewModel: viewModel, wireframe: wireframe) 
関連する問題