【问题标题】:Send value from function to an other VC, swift3将值从函数发送到另一个 VC,swift 3
【发布时间】:2017-07-06 08:18:13
【问题描述】:

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

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

}

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

【问题讨论】:

标签: ios swift function swift3 uiimage


【解决方案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
} 

【讨论】:

  • 我收到此错误:无法将类型“__NSCFString”(0x1070424f0)的值转换为“UIImage”(0x10b3dab30)。
【解决方案2】:

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

【讨论】:

  • 恕我直言,这是最好的方法。您只需将 URL 注入另一个视图控制器。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

    代表

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

    基本上,在委托视图控制器中您将需要以下内容。

    1. 一个“协议”,其中包括一种方法来传递所需的 委托对象的信息。

    2. 一个委托对象。

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

    4. 在适用的情况下调用委托的方法。

    在委托视图控制器中

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

    通知

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

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

    比较

    根据我的个人经验,在大型项目中过度使用通知以及重复计划外的更改和修复补丁最终会导致代码不可读和不可维护。授权需要更多的计划和时间来实施,但你总是知道谁在做什么。也就是说,这是两种不同的工具,应根据要求使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多