在两个 ViewController(委托)之间传递数据 - Swift

2023-05-16移动开发问题
3

本文介绍了在两个 ViewController(委托)之间传递数据 - Swift的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

问题描述

限时送ChatGPT账号..

我有两个 ViewController.

  1. FirstVC - 我有 labelbutton 与 segue "modal"

  1. FirstVC - I have label and button with segue "modal"

SecondVC - 我有 PickerViewbutton(返回 FirstVC):

SecondVC - I have PickerView and button (back to FirstVC):

@IBAction func bntback(sender: AnyObject) {
          self.dissmissViewControllerAnimatied(true, completion: nil)
    }

我在 SecondViewController 中创建了委托:

And I created delegate in SecondViewController as:

protocol SendDataDelegate {
   func sendData(text:String)
}

下一步:

class SecondVC: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate {
      var delegate: SendDataDelegate!
      var firstvc = FirstVC()
      var arr = ["First", "Second", "Third"]
      @IBOutlet var pickview: UIPickerView!
      override func viewDidLoad() {
         super.viewDidLoad()
         pickview.dataSource = self
         pickview.selegate = self
     }

我的 PickerView 函数,在这个函数中我使用我的委托作为:

My function of PickerView and in this function I use my delegate as:

func pickerView (pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
  var text = arr[row]
  dispatch_async(dispatch_get_main_quene(), {
  self.delegate.sendData(text)//there is an error: "fatal error: unexpectedly found nil while unwrapping an Optional value"
  )}
}

第一VC:

class FirstVC: UIViewController, SendDataDelegate {
      var data = SecondVC()
      //....
      override func viewDidLoad() {
         super.viewDidLoad()
         self.data.delegate = self
     }
     func sendData (text:String) {
        mylable.text = text
        //or 
        //var txt = text
       //mylable.text = txt
     }
 }

请帮我解决这个问题.

推荐答案

1) 你需要将delegate设置成prepareForSegue:

1) You need to set delegate into prepareForSegue:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if let viewController = segue.destinationViewController as? SecondVC {
        viewController.delegate = self
    }
}

更新:

2) 将 delegate 设置为可选

2) Set delegate as Optional

class SecondVC: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate {
    var delegate: SendDataDelegate?
    ...

    func pickerView (pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        var text = arr[row]
        dispatch_async(dispatch_get_main_quene(), {
            self.delegate?.sendData(text)
        )}
    }

这篇关于在两个 ViewController(委托)之间传递数据 - Swift的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

The End

相关推荐

硬件音量按钮更改应用程序音量
Hardware Volume buttons change in app volume(硬件音量按钮更改应用程序音量)...
2024-08-12 移动开发问题
10

恢复游戏 cocos2d
Resume game cocos2d(恢复游戏 cocos2d)...
2024-08-12 移动开发问题
6

Cocos2D + 仅禁用 Retina iPad 图形
Cocos2D + Disabling only Retina iPad Graphics(Cocos2D + 仅禁用 Retina iPad 图形)...
2024-08-12 移动开发问题
10

[ios.cocos2d+box2d]如何禁用自动旋转?
[ios.cocos2d+box2d]how to disable auto-rotation?([ios.cocos2d+box2d]如何禁用自动旋转?)...
2024-08-12 移动开发问题
7

从 Documents 目录存储和读取文件 iOS 5
Storing and reading files from Documents directory iOS 5(从 Documents 目录存储和读取文件 iOS 5)...
2024-08-12 移动开发问题
9

如何在 cocos2d 环境之外实现 cocos2d 游戏的虚拟摇杆?
How can I implement a virtual joystick for a cocos2d game outside the cocos2d environment?(如何在 cocos2d 环境之外实现 cocos2d 游戏的虚拟摇杆?)...
2024-08-12 移动开发问题
13