我有这个功能,当用户点击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 ...如果需要
正如其他人在他们的回答中所提到的,我们有两种主流方式。互联网上有足够的关于两者使用的文献。我会用自己的话说明简短的解释
代表
委托指的是将一项工作传递给更适合执行该任务的其他对象的过程。鉴于您拥有委托和委托对象,您可以使用委托方式。在您的情况下,具有集合视图的viewController将是委托对象,其中设置图像的视图控制器将是委托。
基本上,您将在委托viewcontroller中需要以下内容。
在委托视图控制器中
通知
通知更像是广播。您发出可以由任何听众接收和处理的应用程序范围的消息。我们使用NSNotification类。信息或消息将在NSNotification的userInfo对象中捕获。每个通知都由名称标识。
通知的优点是您通常不需要跟踪或引用侦听器。您只需要生成有效负载数据,发布通知并完成它。任何类都可以监听通知,并且您的信息有可能在任何活着的对象中处理,并且正在监听它。这可能成为优点或缺点。
对照
根据我的个人经验,在大型项目中过度使用通知以及对更改和修复的重复计划外修补最终会导致无法读取和无法维护的代码。代表团需要更多的计划和时间来实施,但您始终知道谁在做什么。这就是说这些是两种不同的工具,应该按照要求使用。