【问题标题】:Custom protocol delegate method not calling自定义协议委托方法未调用
【发布时间】:2017-07-03 09:59:35
【问题描述】:

我正在尝试使用自定义协议从另一个视图控制器更改一个视图控制器的标签,但它的委托方法没有被调用

ViewController3 代码:

当我点击关闭按钮时,我的 ViewController2 中没有调用它的委托方法。

protocol ViewController3Delegate: class {

  func changeLable(_ text: String)
}

class ViewController3: UIViewController {

  weak var delegate: ViewController3Delegate?

  override func viewDidLoad() {
    super.viewDidLoad()

  }

  override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()

  }

  @IBAction func btnCloseAction(_ sender: Any) {

    delegate?.changeLable("fillter applied")
    self.dismiss(animated: true, completion: nil)
  }
}

ViewController2 代码:

class ViewController2: UIViewController,ViewController3Delegate {

  @IBOutlet weak var lblReport: UILabel!

  let VC3 = ViewController3(nibName: "ViewController3", bundle: nil)

  override func viewDidLoad() {

    super.viewDidLoad()
    VC3.delegate = self
  }

  func changeLable(_ text: String) {

    print("delegate called")
  }

  override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()

  }
}

谁知道我错在哪里,请给我一些解决方案

【问题讨论】:

  • 由于您没有将 VC3.view 添加为子视图,我怀疑您有两个 ViewController3 实例。在ViewController2 中作为您的财产(您看不到)和我们看不到代码的财产。也许由 Storyboard 实例化。 ViewController2s btnCloseAction 被调用,但其 delegate 未设置。
  • @shallowThought 解决方案是什么,我尝试了很多替代方案,但都不起作用。
  • 你了解我的嫌疑人吗?
  • nope.我没有得到我有带有 3 个控制器的标签栏控制器,当我点击第二个标签时,会出现一个视图并关闭按钮操作当前视图控制器被解雇并想要更改可见视图控制器的标签.对于所有 3 个控制器,我正在使用 xib
  • 您正在此处创建ViewController3let VC3 = ViewController3(nibName: "ViewController3", bundle: nil)。但你从不使用它。因此你看不到它。因为你看不到它,所以你不能按它上面的按钮。删除整行以发现它不会以任何方式改变您的应用程序的行为。您发布的代码未显示您实际看到的 ViewController3,因此如果没有更多信息,我们将无法提供帮助。

标签: ios swift3 delegates swift-protocols


【解决方案1】:

您尚未在 ViewController2 中定义一个委托,该委托将用于 ViewController3 中的委托。

看这个:

 protocol ViewController3Delegate: class {

      func changeLable(_ text: String)
    }

    class ViewController3: UIViewController {

      weak var delegate: ViewController3Delegate?

      override func viewDidLoad() {
        super.viewDidLoad()

      }

      override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()

      }

      @IBAction func btnCloseAction(_ sender: Any) {
        if delgate !=nil {

        delegate?.changeLable("fillter applied")
        self.dismiss(animated: true, completion: nil)
    }
      }
    }

然后在你的 ViewController2 类中:

    class ViewController2: UIViewController,ViewController3Delegate {

      @IBOutlet weak var lblReport: UILabel!


      override func viewDidLoad() {

        super.viewDidLoad()
      }

      func changeLable(_ text: String) {

        print("delegate called")
      }

      override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()

      }
          override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
             {

                 if segue.identifier = "Yoursegueientifier"
                  {
                     let vc = segue.destination as! ViewController3
                     vc.delegate = self
                  }                
            }
    }

注意:您必须在情节提要中定义您的 segueidentifer 名称

【讨论】:

  • 感谢您的建议,但与我的情况不同,我有带有 3 个标签的标签栏控制器,因此它无法正常工作,如果您知道如何使用标签栏与代表一起工作,请建议我一些解决方案
  • 所以你想在标签之间传递数据?
  • 是的,就像应用过滤器一样,我有带有 3 个选项卡的选项卡控制器,第一个和第三个选项卡包含关于哪些过滤器可以在单击选项卡 2 时从选项卡 2 应用的数据,显示一个视图以显示过滤器基于过滤器数据的选项应该被过滤它可以是第一个视图或第三个视图没关系,我已经尝试在标签栏控制器上使用委托它正在工作我不知道它不能与其他控制器一起使用的原因
【解决方案2】:

您应该首先像这样从 ViewController2 呈现 ViewController3:

let VC3 = ViewController3(nibName: "ViewController3", bundle: nil)
VC3.delegate = self
self.presentViewController(VC3, animated: true, completion: nil)

另外,您可以删除 viewDidLoad 上方的这一行

let VC3 = ViewController3(nibName: "ViewController3", bundle: nil)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多