swift - 我的委托(delegate)出了什么问题?

标签 swift delegates

我是 swift 的新手,现在我正在学习 delegate。我认为我已经做了正确的事情,但仍然不起作用。

我正在做的是将数据从我的ViewController传递到TestViewController

View Controller :

protocol viewControllerDelegate: class {
  func viewcontrollerdelegate(setviewcontrollerdelegate: ViewController)
}

class ViewController: UIViewController ,UITextFieldDelegate {
  weak var delegate: viewControllerDelegate?

  @IBAction func nextViewandDelegate(sender: AnyObject) {
    self.delegate?.viewcontrollerdelegate(self)
  }

  override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "showTestSegue" {
      if let testViewController = segue.destinationViewController as? TestViewController {
        testViewController.address = address.text!
        testViewController.phone = phone.text!
      }
    }
  }
}

TestViewController:

class TestViewController: UIViewController {

  var name: String?
  var address: String?
  var phone: String?
  var trydelegate: String?

  override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.

    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let VC = storyboard.instantiateViewControllerWithIdentifier("viewcontroller") as! ViewController
    VC.delegate = self
  }

  override func viewWillAppear(animated: Bool) {
    addressLabel.text = address!
    phoneLabel.text = phone!
    trydelegateLabel.text = trydelegate //always nil here
  }
}

extension TestViewController:viewControllerDelegate {
  func viewcontrollerdelegate(setviewcontrollerdelegate: ViewController) {
    self.trydelegate = setviewcontrollerdelegate.address.text!
  }
}

我使用 segue 来传递地址和电话,效果很好。

但是我对委托(delegate)很不满意。谁能帮我一点忙吗?我知道这个问题对你来说有点简单。

非常感谢。

最佳答案

viewDidLoad中的TestViewController中,您创建了新对象vc,该对象与调用prepareForSegue的对象不同> 所以这就是它不起作用的原因。

要解决此问题,请从 viewDidLoad 中删除代码:

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let vc = storyboard.instantiateViewControllerWithIdentifier("viewcontroller") as! ViewController
vc.delegate = self

并在prepareForSegue中添加一行:

testViewController.phone = phone.text!
// New line
self.delegate = testViewController

这应该有帮助。

关于swift - 我的委托(delegate)出了什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35174422/

相关文章:

c# - 编译器为 delegate 关键字生成的密封类包含虚方法

ios - Pinterest 身份验证失败 : -canOpenURL: failed for URL: "pinterestsdk. v1://oauth

ios - 截图时没有相机 View ,只有白色背景

c# - 重播功能和参数列表

ios - 如何从一致的类中正确设置协议(protocol)中的属性?

c# - 使用运行时类型创建通用 Func 委托(delegate)

Swift:错误:线程 1:更新函数上的 EXC_BAD_INSTRUCTION

ios - 如何在底部的每个屏幕中显示 View

ios - swift xcode : How do I draw on the same view as a text field plus a list of buttons?

c# - 具有委托(delegate)类型的通用方法