Swift - 子视图上的按钮,在父视图中显示方向
Posted
技术标签:
【中文标题】Swift - 子视图上的按钮,在父视图中显示方向【英文标题】:Swift - Button on Child View which Displays Directions in Parent View 【发布时间】:2018-01-18 23:03:46 【问题描述】:我正在创建类似于此处讨论的 Apple Maps 底页的内容: How to mimic ios 10 maps bottom sheet
我创建了一个子视图infoViewController.xib (InfoViewController.swift - 代码和 InfoViewController.xib - 视图设计) 这个子视图将出现在我的地图前面,就像 Apple Maps 示例一样,因此您仍然可以看到它后面的地图。
mapView 由 MapViewController.swift 控制,我使用以下代码从那里调用它:
func addInfoView()
let infoVC = InfoViewController()
self.addChildViewController(infoVC)
self.view.addSubview(infoVC.view)
infoVC.didMove(toParentViewController: self)
我在这个视图上设置了一个“方向”按钮作为 IBAction。当按下此按钮时,我希望它创建方向并将它们显示在 MapViewController 的地图上。目的地和当前位置信息通过 UserDefaults 传递给 infoViewController。我让它'工作':
@IBAction func infoDirectionButton(_ sender: Any)
/*here i have it getting current and destination locations*/
let storyboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let mapViewController = storyboard.instantiateViewController(withIdentifier: "MapViewController") as! MapViewController
self.present(mapViewController, animated: false)
//routeDirection Method is in MapViewController and handles the direction requests
mapViewController.routeDirections(current: current, destination: destination)
mapViewController.addInfoView()
这会导致屏幕上显示方向,但不会在屏幕闪烁之前显示,因为它会重新加载我的 mapView 和 infoView(子视图)。
有没有办法让它在不重新加载父视图和子视图的情况下显示方向。
需要'self.present'代码,所以我可以在那个ViewController中调用该方法,它也不会在地图上显示方向。
self.present(mapViewController, animated: false)
和 addInfoView() 在显示路线后重新加载子视图。否则不再显示
mapViewController.addInfoView()
抱歉,如果这很难理解,我已尝试简化代码以突出问题。
【问题讨论】:
【参考方案1】:我首先想到的是,您可以在查找和设置方向的位置添加通知。之后,您可以从具有您的地图的控制器中观察到该通知。
【讨论】:
感谢您的建议,我会尝试的。如果它已经显示,我已经使用通知来更新子视图。我正在拔头发试图对它进行排序,非常感谢@B.Uyar 关于如何设置子视图的快速跟进问题。我的子视图类是:class InfoViewController: UIViewController, CLLocationManagerDelegate
这是正确的方法吗?我在某处读过它应该是class InfoViewController: MapViewController
【参考方案2】:
根据@B.Uyar 的建议,我在子视图上的方向按钮上实现了NotificationCenter.default.post
,在父视图的ViewDidLoad 中实现了NotificationCenter.default.addObserver
。
我注意到通知观察者被多次调用(与我离开并返回地图屏幕的次数相同)
我阅读了NSNotificationCenter calling two times,它告诉我,当视图未使用时,我需要使用删除观察者。所以:
override func viewWillDisappear(_ animated: Bool)
NotificationCenter.default.removeObserver(self, name: NSNotification.Name(rawValue: "name"), object: nil)
看起来它正在按预期工作。这个线程可能会总结其他一些线程,但我认为它可能对任何遵循类似思维过程的人仍然有用。
【讨论】:
以上是关于Swift - 子视图上的按钮,在父视图中显示方向的主要内容,如果未能解决你的问题,请参考以下文章
Swift - UIPickerView 子视图中没有出现工具栏完成按钮