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

时间:2017-07-06 08:18:13

标签: ios swift function swift3 uiimage

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

这是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("--------")

}

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

4 个答案:

答案 0 :(得分:1)

您可以通过自定义通知轻松完成此操作。在第二个视图控制器中设置一个观察者,并在第一个视图控制器中发布包含变量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
} 

答案 1 :(得分:1)

在这里找到一些例子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 ...

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

<强>代表

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

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

  1. '协议',其中包含传递所需内容的方法 信息到代表对象。

  2. 委托对象。

  3. 对第二个视图控制器的引用,将被设置为 第一个viewcontroller的委托。

  4. 在适用的地方调用代理方法。

  5. 在委托视图控制器

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

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

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

      <强>比较

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