Как мы можем передать замыкания любому ViewController в потоке приложения? - PullRequest
0 голосов
/ 20 февраля 2019

В View Controller A,

var completionBlock: (((String) -> ()))? = nil

и я вызываю блок завершения, как (ViewController A):

if let block = completionBlock {
     block("block data to pass") 
}

Я не хочу передавать данные завершения вViewController B, вместо этого я хочу перейти к ViewController C, который представляет из ViewController B.

Проще говоря, я хочу передать данные замыкания из ViewController A в ViewController C Я знаю, как передавать данные с делегатами,просто любопытно с замыканиями?

Как мы можем этого достичь?

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Это просто пример кода, который я быстро написал для вас, вы можете изменять объекты в зависимости от ваших потребностей.Надеюсь, решит вашу проблему.

import UIKit

class ViewControllerA: UIViewController {
    var block:(((String) -> ()))? = { input in
        print(input)
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        self.title = "A"
        let VCB = ViewControllerB()
        let VCC = ViewControllerC()
        VCC.block = block
        VCB.VCC = VCC
        self.navigationController?.pushViewController(VCB, animated: true)

    }


}

class ViewControllerB: UIViewController {
    var VCC:ViewControllerC?
    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.backgroundColor = .gray

    }
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        if let VCC = VCC {
            self.present(VCC, animated: true, completion: nil)
        }
    }


}

class ViewControllerC: UIViewController {
    var block:(((String) -> ()))? = nil

    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.backgroundColor = .yellow
        //Will run the block that has been passed
        block?("test")
    }


}
0 голосов
/ 20 февраля 2019

Если этот блок нужно передать между несколькими viewControllers, у вас есть несколько вариантов:

1 - Передать замыкание как переменную: создать переменную для каждого нового ViewController в середине VC-A, VC-C и передать их между

, например:

//View Controller B:
var block:(((String) -> ()))? = nil

//Pass from A-B
if let viewcontrollerB = XXXX { //instantiate ViewController B from A
    viewcontrollerB.block = self.block
}


//ViewController C:
var block:(((String) -> ()))? = nil

//Pass from B-C
if let viewcontrollerC = XXXX { //instantiate ViewController C from B
    viewcontrollerC.block = self.block
}

//Call the block from ViewController C
if let block = self.block {
   block("block data to pass") 
}

2-Pass через Центр уведомлений Вы можете передать этот блок из любого контроллера представления в любой другой:

//send notification:
let notification = Notification(name: Notification.Name("pass block"), object: block, userInfo: nil)
NotificationCenter.default.post(notification)

3-Доступ из общего объекта. Используйте одноэлементный дизайн, создайте статический общий объект и считывайте / записывайте в объект из разных контроллеров представления

//AppDelegate:
static var block:(((String) -> ()))? = nil

//ViewController A:
AppDelegate.block = XXX

//ViewController C:
if let block = AppDelegate.block {
   block("block data to pass") 
}
...