Ios 将数据传回第一个viewController

Ios 将数据传回第一个viewController,ios,swift,Ios,Swift,我对如何处理swift协议在两个ViewController之间传递数据有基本了解。我的情况是:我想将数据传递回我的第一个viewcontroller 例如: 第一视图控制器 class ViewControllerA: UIViewController, ViewControllerCResult { func set(data: String) { } } class ViewControllerB: UIViewController { } protocol V

我对如何处理swift协议在两个ViewController之间传递数据有基本了解。我的情况是:我想将数据传递回我的第一个viewcontroller

例如:

第一视图控制器

class ViewControllerA: UIViewController, ViewControllerCResult {

    func set(data: String) {

    }

}
class ViewControllerB: UIViewController {

}
protocol ViewControllerCResult {
   set(data: String)
}

class ViewControllerC: UIViewController {
    var delegate: ViewControllerCResult?
}
第二视图控制器

class ViewControllerA: UIViewController, ViewControllerCResult {

    func set(data: String) {

    }

}
class ViewControllerB: UIViewController {

}
protocol ViewControllerCResult {
   set(data: String)
}

class ViewControllerC: UIViewController {
    var delegate: ViewControllerCResult?
}
第三视图控制器

class ViewControllerA: UIViewController, ViewControllerCResult {

    func set(data: String) {

    }

}
class ViewControllerB: UIViewController {

}
protocol ViewControllerCResult {
   set(data: String)
}

class ViewControllerC: UIViewController {
    var delegate: ViewControllerCResult?
}
ViewControllerA->ViewControllerB->ViewControllerC

我想将数据从ViewControllerC传递到ViewControllerA。
有人能帮我吗?

你可以从控制器A->B->C传递
委托
,当调用popViewcontroller时,你可以检查ViewController C中的
自.委托
,如果它存在,只需调用像这样的
自.委托?.set(“数据自C”)
。检查

ViewController3中的popControllerPressed函数

第一视图控制器

class ViewController2: UIViewController, ViewControllerCResult {

var delegate: ViewControllerCResult?

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

@IBAction func pushControllerPressed(_ sender: Any) {
    if let viewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ViewController3") as? ViewController3 {
        if let navigator = navigationController {
            viewController.delegate = self.delegate
            navigator.pushViewController(viewController, animated: true)
        }
    }
}

func set(data: String) {
    print(data)
}

}
protocol ViewControllerCResult {
   func set(data: String)
}
类ViewController:UIViewController、ViewControllerResult{

var delegate: ViewControllerCResult?

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

@IBAction func pushControllerPressed(_ sender: Any) {
    if let viewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ViewController2") as? ViewController2 {
        if let navigator = navigationController {
            viewController.delegate = self
            navigator.pushViewController(viewController, animated: true)
        }
    }
}

func set(data: String) {

}

}
var delegate: ViewControllerCResult?

func set(data: String) {
    print(data)
}

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

@IBAction func popControllerPressed(_ sender: Any) {
    for controller in self.navigationController!.viewControllers as Array {
        if controller.isKind(of: ViewController.self) {
            delegate?.set(data: "data from C")
            self.navigationController!.popToViewController(controller, animated: true)
            break
        }
    }

}

}
第二视图控制器

class ViewController2: UIViewController, ViewControllerCResult {

var delegate: ViewControllerCResult?

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

@IBAction func pushControllerPressed(_ sender: Any) {
    if let viewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ViewController3") as? ViewController3 {
        if let navigator = navigationController {
            viewController.delegate = self.delegate
            navigator.pushViewController(viewController, animated: true)
        }
    }
}

func set(data: String) {
    print(data)
}

}
protocol ViewControllerCResult {
   func set(data: String)
}
第三视图控制器

class ViewController2: UIViewController, ViewControllerCResult {

var delegate: ViewControllerCResult?

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

@IBAction func pushControllerPressed(_ sender: Any) {
    if let viewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ViewController3") as? ViewController3 {
        if let navigator = navigationController {
            viewController.delegate = self.delegate
            navigator.pushViewController(viewController, animated: true)
        }
    }
}

func set(data: String) {
    print(data)
}

}
protocol ViewControllerCResult {
   func set(data: String)
}
类ViewController3:UIViewController、ViewControllerResult{

var delegate: ViewControllerCResult?

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

@IBAction func pushControllerPressed(_ sender: Any) {
    if let viewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ViewController2") as? ViewController2 {
        if let navigator = navigationController {
            viewController.delegate = self
            navigator.pushViewController(viewController, animated: true)
        }
    }
}

func set(data: String) {

}

}
var delegate: ViewControllerCResult?

func set(data: String) {
    print(data)
}

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

@IBAction func popControllerPressed(_ sender: Any) {
    for controller in self.navigationController!.viewControllers as Array {
        if controller.isKind(of: ViewController.self) {
            delegate?.set(data: "data from C")
            self.navigationController!.popToViewController(controller, animated: true)
            break
        }
    }

}

}

这里是代码链接:

它们是链接的吗?例如,B是a的孩子,C是B的孩子吗?你是如何实例化你的ViewController的?你能写下为什么你需要将数据传递给第一个控制器吗?a&C永远不应该通信。这违反了德米特定律。如果C和B是a的孩子,可能会更好,即使这意味着B要求a显示C.这反映了A是主控制器,B和C是主控制器的子控制器的想法。然后它只是将数据传递给父控制器。我知道如何在HackSaw上实现它。它成功了。我创建了一个函数来接收值​​直接通过,因为B和C是A的孩子。