向下滑动以关闭另一个视图控制器时,有没有办法将数据传回视图控制器?

Posted

技术标签:

【中文标题】向下滑动以关闭另一个视图控制器时,有没有办法将数据传回视图控制器?【英文标题】:Is there a way to pass data back to a view controller when swiping down to dismiss another view controller? 【发布时间】:2020-04-14 13:13:08 【问题描述】:

我有一个视图控制器,我们称之为 vc1,它使用 prepare for segue 将一些数据传递给另一个 (vc2),然后调用 performSegue。

当通过向下滑动关闭 vc2 时,有没有办法将一些数据从 vc2 传递回 vc1?

谢谢,

编辑 --

对于缺乏信息深表歉意,对于 swift 非常陌生,因此不确定在这种情况下要问的正确问题。

详细地说,目前问题的根源是 vc2 没有以编程方式被解雇。即当前没有调用函数,它只是被用户向下滑动而解除。

是否可以包含一些函数来捕获此解雇,并使用它将数据发送回 vc1?

如果可能的话,我不希望在 vc2 中添加任何按钮。

再次道歉,感谢您已经提供的所有帮助!

【问题讨论】:

您可以使用委托方法将数据传回预览视图控制器 hackingwithswift.com/example-code/system/… 现代轻量级 swifty 方式是回调闭包。 【参考方案1】:

试试这个

class VCOne: UIViewController 

//Create a shared instance of VCOne

 static var sharedInstance:VCOne?

 //Let the data to be passed back to VCOne is of type string

  var dataToBePassedBack:String?

  override func viewDidLoad() 
    super.viewDidLoad()

   //set the sharedInstance to self
    VCOne.sharedInstance = self

    

Class VCTwo:UIViewController

 //function in which you are dismissing your current VC you can use the shared 
 instance to pass the data back

func dismissVC()

  //before dismissing the VCTwo you can set the value for VCOne

VCOne.sharedInstance?.dataToBePassedBack = "data" 





【讨论】:

您好 Anmol,感谢您的建议。当用户向下滑动以关闭 VCTwo 时,有没有办法调用dismissVC?目前我没有关闭这个 VC 的功能,它只是被用户向下滑动。对我的无知表示歉意! 您可以检测控制器何时被关闭。请检查此参考 [***.com/questions/56568967/… 啊,好吧,这实际上正是我需要知道的。谢谢!【参考方案2】:

你这样做的一种方法是创建另一个文件,它是所有东西的控制器,然后有一个委托,当有新的更改可用时,它总是通知视图控制器。我会逐步完成的。

     protocol HeadControllerDelegate 
        // Create a function that sends out the data to the delegates when it is called
        // You can use your custom struct here to pass more data easly
        func didReciveNewData(myData: String?)
    

    struct HeadController 

        // Create a shared instance so that the viewcontroller that conforms to the view as well as when we sends out the data the delegate is correct
        static var shared = HeadController()
        // Creates the delegate, every view can asign it to
        public var delegate: HeadControllerDelegate?

        // Add all your values here you want to pass back
        var myValue: String? 
            // The didSet gets called every time this value is set, and then is it time to call the delegate method
            didSet 
                // Calls the delegates didReciveMethod to notify the delegates that new data exsists
                delegate?.didReciveNewData(myData: myValue)
            
        
    

现在在您希望数据可用的视图控制器类中(正如您在向下滑动时所说的那样)

    class ViewController: UIViewController 

    // Here you create a property of the shared instance
    let headController = HeadController.shared

    override func viewDidLoad() 
        super.viewDidLoad()

        // Set yourself as the delegate for the headController delegate to recive data
        headController.delegate = self

    



extension ViewController: HeadControllerDelegate 

    // here will the data be recived
    func didReciveNewData(myData: String?) 
        // handle the data here, you have now got newData

        print(myData)
    

在您要传递数据的类中,您只需这样做。这样做的好处是您可以拥有多个写入头控制器数据的类或结构(只要确保您认为共享实例)。根据我们的说法,使用委托模式也是一种很好的做法。

class Sender 

    var headController = HeadController.shared

    func sendData(data: String) 

        // Here you change the data of the headcontroller wich will send the data to all the delegates
        headController.myValue = data
    

希望这个答案有帮助。如果您有任何问题,请告诉我。

更新——更简单的解决方案

根据我的说法,这是一个更简单的解决方案,但可扩展性不如前一个。

在 prepareForSegue 中,只需将当前 viewContorller 作为目标视图控制器中的字段传递。然后当 viewDidDissapear 在新的视图控制器中时,您可以简单地传回数据。不用担心,我会告诉你的!

准备转战

 override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
    if let dc = segue.destination as? SecondViewController 
        dc.viewController = self
    

并声明 secondViewContorller 如下。 ViewDidDisappear 方法将在视图关闭时调用,因此您可以在使用 prepare for segue 方法之前将数据传递给您设置的视图控制器。

    class SecondViewController: UIViewController 

    var viewController: UIViewController?

    override func viewDidLoad() 
        super.viewDidLoad()
    

    override func viewDidDisappear(_ animated: Bool) 
        (viewController as? ViewController)?.value = 2
    


然后您可以使用 didSet 更新 UI,它会在设置属性时简单地调用,这将在视图的 did消失方法中完成。

var value: Int = 0 
    didSet 
        print(value)
        text?.text = "\(value)"
    

希望这会有所帮助!

【讨论】:

【参考方案3】: 使用 ProtocolDelegate 你做或其他选项是 NSotificationcenter

【讨论】:

以上是关于向下滑动以关闭另一个视图控制器时,有没有办法将数据传回视图控制器?的主要内容,如果未能解决你的问题,请参考以下文章

向下滑动关闭垂直滚动视图

新屏幕尺寸的动画视图问题

jQuery:向下滑动并以特殊方式将一个背景图像替换为另一个背景图像

iOS Swift - 在呈现新的视图控制器时呈现视图控制器向下滑动

滑动手势识别器对我不起作用

推动视图控制器时防止键盘关闭