ios - 在处理容器 VC 时无法让我的委托(delegate)协议(protocol)工作?

标签 ios swift delegates

我无法让我的委托(delegate)协议(protocol)工作。我使用这个堆栈溢出问题作为指南 dispatch event to parent ViewController in swift .我不知道自这篇文章以来 Swift 3 是否发生了变化,但我在 parentViewController 中的函数从未被调用过。这是我的设置。

//PROTOCOL 

protocol PDPPropDetailsDelegate {
func buttonPressed(PropDetailsVC: propertyDetailsVC)

}

// subview Controller

class propertyDetailsVC: UIViewController {

  var delegate: PDPPropDetailsDelegate?

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

}

按钮在 subview Controller 中被调用。

//父 View Controller

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")
  }
}

Button Pressed 永远不会被调用。我认为这与未正确设置委托(delegate)有关。不完全确定为什么会这样。我的 setUpPropertyDetailsUI(property: filterImages) 从那个 VC 中获取 Outlets 并设置它工作得很好。我做了一个断点,当我分段到 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.
 }
 */

 }

最佳答案

您似乎对应用程序的流程有些困惑。这是我针对其他人关于同一主题的问题所写的答案:

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

您的协议(protocol)和 subview Controller 看起来不错,但此处的其余代码存在很多问题:

您的 prepare(for segue:_, sender:_) 通常是您为目标(子) View Controller 设置委托(delegate)的地方。

PropertyDetailsVC.delegate = self 不会做任何事情 - 您需要一个 View Controller 的实例来设置它的委托(delegate)。

看起来您正在使用某种容器全局变量,我不确定它的用途。

看看我发布的答案,再试一次。它在 Swift 3 中。

关于ios - 在处理容器 VC 时无法让我的委托(delegate)协议(protocol)工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45618277/

相关文章:

ios - 按住自定义 UIButton 时更改深灰色突出显示的颜色?

ios - NSArray 与 C Array 性能比较

ios - UIView 动画忽略持续时间

ios - 如何使用 NSUserDefaults 将 UIImages 保存在应用程序目录中并在 UITableViewCell 中显示它们?

objective-c - 从 MGTwitterEngine 获取用户详细信息

ios - 如何制作 UIPopoverController (Swift)?

快速使动画效果永久化

ios - Xcode 6 - Swift - 带导航的自定义标签栏

javascript - c# 中等效的 javascript 闭包是什么?

ios - swift 将 View 设置为自己的委托(delegate)