2016-12-11 6 views
-1

サブビューのプロパティにviewcontrollerにどのようにアクセスできますか。サブビューからViewControllerへのアクセスプロパティSwift

例:@IBOutletが弱い場合は、var loginBtn:UIButton!どのように私はそれを私のView Controllerにアクセスできますか?私はそれを行う方法の多くのこととチュートリアルを行いましたが、それでも動作させることはできませんでした。

また、xibをロードする最も良い方法は何ですか?チュートリアルで見た方法はたくさんありますが、プロダクションアプリでどのように行うかについても知りたいと思います。

protocol UserLoginDelegate { 
    func userDidLogin(status: Bool, message: String) 
} 

@IBDesignable class LoginWidget: UIView { 

    var loginDelegate: UserLoginDelegate? 
    var loginView: UIView! 
    var nibName: String = "LoginWidget" 

    let defaults = NSUserDefaults.standardUserDefaults() 

    @IBOutlet weak var loginButton: UIButton! 
    @IBOutlet weak var email: UITextField! 
    @IBOutlet weak var password: UITextField! 
    @IBOutlet weak var name: UITextField! 
    @IBAction func loginBtn(sender: AnyObject) { 

    // init 
    override init(frame: CGRect) { 
     super.init(frame: frame) 

     // set anything that uses the view or visible bounds 
     setup() 
    } 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 

     // setup 
     setup() 
    } 

    func setup() { 
     loginView = loadViewFromNib() 
     loginView.frame = bounds 
     loginView.autoresizingMask = [UIViewAutoresizing.FlexibleWidth, UIViewAutoresizing.FlexibleHeight] 

     addSubview(loginView) 

    } 

    func loadViewFromNib() -> UIView { 
     let bundle = NSBundle(forClass: self.dynamicType) 
     let nib = UINib(nibName: nibName, bundle: bundle) 
     let view = nib.instantiateWithOwner(self, options: nil)[0] as! UIView 

     return view 
    } 

} 

コントローラ

class AuthenticationViewController: UIViewController, UserLoginDelegate { 
     override func viewDidLoad() { 
     super.viewDidLoad() 

     loginWidget = LoginWidget(frame: CGRect(x: 0, y: 171, width: 375, height: 247)) 
     authenticationSegment.setEnabled(true, forSegmentAtIndex: 0) 
     loginWidget.loginDelegate = self 
     self.view.addSubview(loginWidget) 

     // Do any additional setup after loading the view. 
    } 
} 
+0

1つの関連性のない質問が多すぎます。 – matt

答えて

0

はちょうど最初の約SO:ここでの目標は、一種のパ​​ターンを以下の群衆ソースのナレッジベース(!オントロジー)を持つことです。普通のユーザーの質問のような形式:

私はこれについて混乱しています。私はこの非常に特定のことを達成したい。ここで私が試したコードです。私はこれが問題だと思う。どのように正しくこれを行うか、それを動作させる方法を私に教えてもらえますか?

最終的に、私たちは直接的な解決策を用いて索引付けされた検索可能な問題の長いリストを取得します。

私が持っている場合:これらのwishy washyの一種、不特定、マルチ質問、投稿がdownvoted取得する傾向が混乱、無視は、私はあなたの質問に対処します

などなど、言い換えるように言わ@IBOutlet弱い変数loginBtn:UIButton!どのように私は 私のビューコントローラにアクセスすることができますか?私は多くのことを行いましたし、チュートリアルでそれを行うには しかし、私はそれを動作させるために管理していませんでした。

UIButtonまたは任意のUIControlサブクラスを使用して、@ IBActionをビューコントローラにドラッグできます。これを達成するには、問題のストーリーボードボタンからコードにドラッグして(コンセントを作ったのと同じ方法で)、ドロップダウンからActionを選択します。次に、このアクションを送信するオブジェクトのタイプを変更することができます(UIButtonか、誰でもこのメソッドを呼び出すことができます。ボタンにリンクされているだけです)。または、呼び出されたコントロールイベントを変更できますつまり、ボタンの下にタッチしたときや指がまだボタンの内側に触れているときにタッチしたときです。

さらに一般的には、コントロールではない複雑なビュー(つまりUITapGestureRecognizer)を追加し、そこからIBActionをドラッグすることができます(ジェスチャ認識ツールをビューにドラッグし、左ペインからジェスチャrecからコードにドラッグしてアクションを再度選択) 。

最後に、これは現在必要な以上のものですが、ビューコントローラに何かを知らせる必要があるビューがある場合、またはビューコントローラ(またはオブジェクト)に「データを送信してください"、デリゲートパターンを使用することができます。簡単に言えば、プロトコルで必要なメソッドと変数をリストするプロトコルを定義します。あなたは、デリゲートオブジェクトは、あなたが

weak var delegate: MyProtocol? 

ようなあなたのビューで変数を入れデリゲートパターンは、スウィフトに重要であり、あなたはおそらくそれをよく読んでする必要があり、各メソッドに実装を与えることによって、このプロトコルに準拠します。たとえば、テーブルビューを使用した場合は、おそらくそれを使用しています。

また、xibを読み込む最良の方法は何か混乱していますか?私がチュートリアルで見た方法はたくさんありますが、彼らが 制作アプリでやっていることも知りたいです。

ここでは、xibファイルの所有者であるすべてのビューを開始します。私はこれが正しい方法だと信じて、これが間違っていれば修正を感謝するでしょう。これは迅速な3です。この時点で使用する必要があります。はるかに優れています!

@IBOutlet var mainView: UIView! 
// the above is the outlet from the xib's main view. which I always call main view 

override init(frame: CGRect) { 
    super.init(frame: frame) 
    combinedInit() 
} 

required init?(coder aDecoder: NSCoder) { 
    super.init(coder: aDecoder) 
    combinedInit() 
} 


func combinedInit(){ 

    Bundle.main.loadNibNamed("XibFileName", owner: self, options: nil) 
    addSubview(mainView) 
    mainView.frame = self.bounds 
    // more initialization stuff 
} 
関連する問題