向下滑动以关闭另一个视图控制器时,有没有办法将数据传回视图控制器?
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】: 使用 Protocol 和 Delegate 你做或其他选项是 NSotificationcenter。【讨论】:
以上是关于向下滑动以关闭另一个视图控制器时,有没有办法将数据传回视图控制器?的主要内容,如果未能解决你的问题,请参考以下文章
jQuery:向下滑动并以特殊方式将一个背景图像替换为另一个背景图像