2017-03-11 24 views
0

私のプロジェクトのいくつかでは、多くの場合、私は大きな構造を作成していないと思います。UIViewサブクラスのアクセスViewControllerメソッドswift

私はゲームボード(チェスについて考える)を8 * 8セルのグリッドで作成したゲームかもしれません。各セルには、サブクラス(cell.swift)に依存するジェスチャ認識子があり、ゲームロジックは親ViewControllerにあります。

議論のために、タッチした四角形をユーザーに表示したいとしましょう。

私は

UIApplication.shared.keyWindow?.rootViewController?.present(alertController, animated: true, completion: nil) 

(この例では、サブクラス化のUIView/cell.swiftでアラートを作成します。obvs)サブクラス化のUIViewからこれを行う方法を見つけたが、の構造を壊すようですアプリ - 親ViewControllerのアクションにアクセスするのと同じではないでしょうか?これに最も近いアプローチは何ですか>

答えて

1

rootViewControllerは、スタックの一番下にあるVCです。目に見えるVCにアクセスするための安全な方法ではなく、一般的に有用であることはめったにありません(ケースがありますが、あなたのアプリが役に立つとは思えません)。

おそらく、デリゲートパターンです。チェスボードを表示する親VC(このMyBoardViewControllerと呼ぶ)は、次のようなプロトコルに準拠しているとします。 、

weak var delegate : SquareAlertHandler? 

そして、あなたが現在使用しているものは何でもイベントハンドラを置き換える:

protocol SquareAlertHandler { 
    func handleSquarePressed(sender : myView) 
} 

そして、あなたのMYVIEWクラスに次のプロパティを追加します。MYVIEWはあなたがチェスの正方形のために使っているものは何でもカスタムUIViewクラスであります以下の(私はあなたがプレスを処理するためにIBにUIButtonを使用していると仮定していて、任意に流出命名した「didPress:」):で今

@IBAction didPress(sender : UIButton) { 
    delegate?.handleSquarePressed(self) 
} 

、ヨーヨーにプロトコルを追加あなたはMYVIEWインスタンスを作成どこでも、デリゲートとしてMyBoardViewControllerインスタンスを割り当て、あなたが行ってもいいです、

class MyBoardViewController : UIViewController, SquareAlertHandler { 

    ... ... ... 
    func handleSquarePressed(sender : myView) { 
     // Do something to handle the press, here, like alert the user 
    } 
    ... ... ... 
} 

そして最後に:ウルMyBoardViewControllerは、メソッドを定義します。

スピーディーなリテラシーによっては、これが混乱する可能性があります。コードを追加することで、クラス名を少なくとも一致させることができますので、事柄を明確にするのに役立ちます。

+0

これはうまくいきますが、私はプロトコルと代議員を理解しています。これを一般的な回答として残しておくことは、他の読者には便利かもしれません。ありがとうございます - ちょうど学び、実際にはこのタイプの(ほとんど問題ではない)問題をカバーするリソースを見つけるのは難しいです。 – stevenpcurtis

+0

いいね!言語を頻繁に変更したり、新しい言語に変更すると、コーディングパターンが厳しくなります。幸運と、すべてのこと。 – dylanthelion

+0

1つの問題 - 以前は代理人を使用していましたが、常に代理人を設定しました。ここでは、いつも何も起こっていないようです。 – stevenpcurtis

関連する問題