从函数发送值到另一个VC,swift3

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从函数发送值到另一个VC,swift3相关的知识,希望对你有一定的参考价值。

我有这个功能,当用户点击collectionView上的图像时调用该功能。有一个变量url(在行print("IMAGE CLICKED:", url))我想将url的值发送到另一个viewController并在url中设置UIImage

这是我在firstVC的未完成的功能。从这里我想把url送到secondVC

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    selectedCommunity = (liveCommunities?[indexPath.row].communityId)!
    let home = HomeViewController()
    home.showCommunityDetail()

    //url is the source for a image in another viewController
    //TODO: Send url to other viewController
    //There is no relation between the thwo viewControllers (only via tabbar)

    print("--------")
    print("IMAGE CLICKED:", url)
    print("--------")

}

那可能吗?感谢您的帮助!

答案

您可以通过自定义通知轻松完成此操作。在第二个视图控制器中设置一个观察者,并使用包含该变量的userInfo发布通知。您可以通过检索userInfo轻松处理第二个视图控制器中的URL。

第一视图控制器:

NotificationCenter.default.post(name: Notification.Name.init(rawValue: "imagePressed"), object: nil, userInfo: ["imageUrl": url])

第二视图控制器:

NotificationCenter.default.addObserver(self, selector: #selector(imagePressed(_:)), name: Notification.Name.init(rawValue: "imagePressed"), object: nil)

func imagePressed(_ notification: Notification) {
    let url = notification.userInfo!["imageUrl"] as! URL
} 
另一答案

在这里找到一些例子https://stackoverflow.com/a/24036067/8263682如果需要如何从故事板创建控制器并呈现它(或者你可以推它)

// Swift 3.0
let storyboard = UIStoryboard(name: "MyStoryboardName", bundle: nil)
let controller = storyboard.instantiateViewController(withIdentifier: "someViewController")
self.present(controller, animated: true, completion: nil)

这是你可以将图像Url设置为它的属性(或作为方法参数发送)

controller.url = url

但我看到你在标签栏中有第二个控制器。所以你可以这样访问它(参见https://stackoverflow.com/a/25393586/8263682

var svc:SecondViewController = self.tabBarController.viewControllers[1] as SecondViewController!
svc.url = url

或者使用NotificationCenter.default.post ...如果需要

另一答案

是的你可以。使用代表。您还可以发布通知并在之前的控制器中观察它。请检查this答案是否使用代表。如果您更喜欢使用通知,请使用this答案

另一答案

正如其他人在他们的回答中所提到的,我们有两种主流方式。互联网上有足够的关于两者使用的文献。我会用自己的话说明简短的解释

代表

委托指的是将一项工作传递给更适合执行该任务的其他对象的过程。鉴于您拥有委托和委托对象,您可以使用委托方式。在您的情况下,具有集合视图的viewController将是委托对象,其中设置图像的视图控制器将是委托。

基本上,您将在委托viewcontroller中需要以下内容。

  1. “协议”,包括将所需信息传递给委托对象的方法。
  2. 委托对象。
  3. 对第二个视图控制器的引用,它将被设置为第一个视图控制器的委托。
  4. 在适用的地方调用代理方法。

在委托视图控制器中

  1. 您必须确认之前声明的协议。
  2. 在协议中实现所需的方法。

通知

通知更像是广播。您发出可以由任何听众接收和处理的应用程序范围的消息。我们使用NSNotification类。信息或消息将在NSNotification的userInfo对象中捕获。每个通知都由名称标识。

通知的优点是您通常不需要跟踪或引用侦听器。您只需要生成有效负载数据,发布通知并完成它。任何类都可以监听通知,并且您的信息有可能在任何活着的对象中处理,并且正在监听它。这可能成为优点或缺点。

对照

根据我的个人经验,在大型项目中过度使用通知以及对更改和修复的重复计划外修补最终会导致无法读取和无法维护的代码。代表团需要更多的计划和时间来实施,但您始终知道谁在做什么。这就是说这些是两种不同的工具,应该按照要求使用。

以上是关于从函数发送值到另一个VC,swift3的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有 segue 的情况下在 Swift 3 中将数据从 VC 传递到另一个?

onDetach()不要求从一个片段移动到另一个片段

使用 Node.JS 从一个函数返回值到另一个函数

Swift 3 - 将数据从一个视图传递到另一个视图

如何从一个函数检索对象/变量的值到另一个函数并通过 main 调用这两个函数?

如何将列表视图中的数据从一个片段发送到另一个片段