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 - 子视图上的按钮,在父视图中显示方向的主要内容,如果未能解决你的问题,请参考以下文章

如何使 xib 子视图与 Swift 中的超级视图交互?

Swift - UIPickerView 子视图中没有出现工具栏完成按钮

swift项目第七天:构建访客界面以及监听按钮点击

通过子组件在父组件中反应切换视图功能

基于视图的 NSOutlineView 在父视图之上绘制子视图

TempData 仅显示在子局部视图中,而不显示在父局部视图中