2017-08-10 5 views
1

デリゲートプロトコルを動作させることができません。このスタックオーバーフローの質問をガイドdispatch event to parent ViewController in swiftとして使用しました。私はこの記事からSwift 3で事が変わったのかどうかはわかりませんが、私のparentViewControllerの私の機能は決して呼び出されていません。ここに私のセットアップです。コンテナVCを扱う際に代理プロトコルが機能しないのですか?

//PROTOCOL 

protocol PDPPropDetailsDelegate { 
func buttonPressed(PropDetailsVC: propertyDetailsVC) 

} 

//子ビューコントローラ

class propertyDetailsVC: UIViewController { 

    var delegate: PDPPropDetailsDelegate? 

    @IBAction func emailButton(_ sender: AnyObject) { 
    self.delegate?.buttonPressed(PropDetailsVC: self) 
} 

} 

ボタンは、子ビューコントローラで呼び出さなっています。

//親ビューコントローラ

class ImageDetailsVC: UIViewController, PDPPropDetailsDelegate { 

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if segue.identifier == "container"{ 

     container = segue.destination as! ContainerViewController 

    } 
} 

    @IBAction func segmentControlAct(_ sender: Any) { 

    switch segmentControllerView.selectedIndex { 
    case 0: print("case 1") 
    container!.segueIdentifierReceivedFromParent("first") 

    case 1: print("case 2") 
    container!.segueIdentifierReceivedFromParent("second") 
    PropertyDetailsVC.delegate = self // **WHERE I SET DELEGATE**  
     setUpPropertyDetailsUI(property: filterImages) 


    default: print("default") 
    } 

    } 

    func buttonPressed(PropDetailsVC: propertyDetailsVC) { 
    print("BUTTON PRESSED") 
    } 
} 

押されたボタンが呼び出されることはありません。私はそれが適切に設定されていない代理人と関係があると仮定します。しかし、なぜそれが事実だろうと確信していません。私のsetUpPropertyDetailsUI(プロパティ:filterImages)は、そのVCからアウトレットを取り出して、うまく動作します。私はブレークポイントを行い、PropertyDetailsVCに分割するときに呼び出されます。アドバイスや提案はありますか?

import UIKit 

open class ContainerViewController: UIViewController { 
//Manipulating container views 
fileprivate weak var viewController : UIViewController! 
//Keeping track of containerViews 
fileprivate var containerViewObjects = Dictionary<String,UIViewController>() 

/** Specifies which ever container view is on the front */ 
open var currentViewController : UIViewController{ 
    get { 
     return self.viewController 

    } 
} 


fileprivate var segueIdentifier : String! 

/*Identifier For First Container SubView*/ 
@IBInspectable internal var firstLinkedSubView : String! 


override open func viewDidLoad() { 
    super.viewDidLoad() 



} 
open override func viewDidAppear(_ animated: Bool) { 
    if let identifier = firstLinkedSubView{ 
     segueIdentifierReceivedFromParent(identifier) 
    } 
} 
override open func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

func segueIdentifierReceivedFromParent(_ identifier: String){ 



    self.segueIdentifier = identifier 
    self.performSegue(withIdentifier: self.segueIdentifier, sender: nil) 



} 




override open func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if segue.identifier == segueIdentifier{ 


     //Remove Container View 
     if viewController != nil{ 


      viewController.view.removeFromSuperview() 
      viewController = nil 



     } 
     //Add to dictionary if isn't already there 
     if ((self.containerViewObjects[self.segueIdentifier] == nil)){ 
      viewController = segue.destination 
      self.containerViewObjects[self.segueIdentifier] = viewController 

     }else{ 
      for (key, value) in self.containerViewObjects{ 

       if key == self.segueIdentifier{ 

        viewController = value 


       } 

      } 


     } 

     self.addChildViewController(viewController) 
     viewController.view.frame = CGRect(x: 0,y: 0, width: self.view.frame.width,height: self.view.frame.height) 
     self.view.addSubview(viewController.view) 
     viewController.didMove(toParentViewController: self) 


    } 

} 


} 


import UIKit 

class EmptySegue: UIStoryboardSegue{ 

override func perform() { 

} 

/* 
// MARK: - Navigation 

// In a storyboard-based application, you will often want to do a little preparation before navigation 
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
// Get the new view controller using segue.destinationViewController. 
// Pass the selected object to the new view controller. 
} 
*/ 

} 
+0

あなたのデリゲートを印刷する 'emailButton'関数に、それが設定されているかどうかを表示する行を追加しないでください:' print(self.delegate) ' – toddg

答えて

1

あなたはアプリの流れに少し混乱しているようです。ここで私はこの同じトピックについて他の誰かの質問のために書いた答えだ:

https://stackoverflow.com/a/45312362/3832646

あなたのプロトコルと子ビューコントローラ見栄えが、しかし、ここにあなたのコードの残りの部分と間違っかなりの数のものがあります。

prepare(for segue:_, sender:_)は、通常、宛先(子)ビューコントローラのデリゲートを設定する場所です。

PropertyDetailsVC.delegate = selfは何も行いません。デリゲートを設定するには、View Controllerのインスタンスが必要です。

私はそれが何のためになるかわからないコンテナグローバル変数のいくつかの並べ替えを使用しているようです。

私が投稿した回答を見て、もう一度行ってください。それはSwift 3にあります。

+0

私はcontainerViewControllerを管理するためにライブラリを使用しました。私はそれを反映するために私の質問を編集します。 –

関連する問題