我将如何使用相同的视图控制器,但通过它传递不同的信息?

Posted

技术标签:

【中文标题】我将如何使用相同的视图控制器,但通过它传递不同的信息?【英文标题】:How would I use the same viewcontroller, but pass different information through it? 【发布时间】:2015-10-14 22:47:37 【问题描述】:

所以,我目前的问题如下。

我想基本上使用我当前的视图控制器,但在应用程序中的其他位置更改位置设置,并让数据通过带有更新的位置信息的视图控制器。

我会详细说明。我目前正在使用以下代码进行反向地理编码,并获取用户位置。

func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!) 

    locationManager.stopUpdatingLocation()

    if(locations.count > 0)


        let location = locations[0] as! CLLocation

        //            println(location.coordinate)


        if let currentLocatino = currLocation 
            if CLLocation(latitude: currentLocatino.latitude, longitude: currentLocatino.longitude).distanceFromLocation(location) > 500 
                currLocation = location.coordinate
                self.skip = 0
                self.loadObjects()

            
        
        else 
            currLocation = location.coordinate
            self.skip = 0
            self.loadObjects()
        


        CLGeocoder().reverseGeocodeLocation(CLLocation(latitude: currLocation!.latitude, longitude: currLocation!.longitude), completionHandler: (placemarks, error) -> Void in


            if error != nil 
                println("Reverse geocoder failed with error" + error.localizedDescription)
                return
            

            if placemarks.count > 0 
                let date = NSDate()
                let formatter = NSDateFormatter()
                formatter.dateStyle = .MediumStyle
                formatter.stringFromDate(date)
                let pm = placemarks[0] as! CLPlacemark


                var testifempty = "\(pm.subLocality)"
                if testifempty == "nil"
                
                    self.locationManager.startUpdatingLocation()
                    if let lbutton = self.lbutton
                        lbutton.text = "Hey " + "\(pm.locality)" //+ "\n" + formatter.stringFromDate(date)


                    

                
                else
                
                    self.locationManager.startUpdatingLocation()
                    if let lbutton = self.lbutton 
                        lbutton.text = "Hey " + "\(pm.subLocality)\n" // + formatter.stringFromDate(date)
                    

                
            

            else 
                println("Problem with the data received from geocoder")
            
        )

     else 


        println("Cannot fetch your location")

    


我想要的是,它本质上是通过一个新位置并设置一个布尔值,这样如果该布尔值设置为 false,新位置信息就会通过应用程序传递。

我正在考虑在主视图控制器上使用开关,并在辅助视图控制器上更改位置。

很抱歉,如果这是一篇很长的帖子,但我觉得我正处于弄清楚如何做到这一点的边缘,但我需要确保我朝着正确的方向前进。

也许我可以使用 mapkit 并使用注释?

【问题讨论】:

【参考方案1】:

我不建议使用任何类型的视图来传递或保存信息。开关(如UISwitch)应该以图形方式为用户表示一些其他数据。

如果您不熟悉移动开发,我建议您查看 MVC 设计模式。 Here 是 couple 不同的 resources,让您开始使用它。

如果您需要在应用程序中的某个位置保留一些数据,您可以从任何类(viewController、视图、自定义对象等)访问这些数据,那么Singleton 将是一个很好的解决方案。您可以在整个应用程序中访问传入的地图数据,您可以存储变量并能够从其他类重新分配它们,并且您最终总是只有一个实例,因此您的逻辑线路永远不会被交叉。

单例经常被使用,所以我建议查看实现代码的样子并熟悉它。 Here's a brief example of an implementation.

【讨论】:

【参考方案2】:

对于您的问题,委托模式似乎是最合适的选择。

如果你为你的主视图控制器创建一个协议来声明一个更新其数据的方法,例如locationDidUpdate:,那么主视图控制器可以设置为辅助视图控制器的委托。然后辅助视图控制器可以调用此委托方法并使用新数据更新主视图控制器。

例如,可以在您的第一个视图控制器中声明一个协议,例如:

protocol LocationViewControllerDelegate: class 
    func locationDidUpdate(location: CLLocation)

然后让您的辅助视图控制器符合协议并创建委托属性:

weak var delegate: LocationViewControllerDelegate?

当你需要更新位置时,调用委托方法:

delegate.locationDidUpdate(myNewLocation)

拥有一个管理基于事件的更新的协议通常是一个优势,因为它提供了一个清晰的契约,可以很容易地被其他类实现。

【讨论】:

是的,这是一条非常好的路线,也不太复杂。稍后我会告诉你进展如何,我可能还有一些问题。 我已经有一个问题了,我应该把委托方法放在第一个视图控制器的哪里正确? @JamesChen,是的,你可以在你的第一个视图控制器中声明你的协议。

以上是关于我将如何使用相同的视图控制器,但通过它传递不同的信息?的主要内容,如果未能解决你的问题,请参考以下文章

Rails - 相同的模型/控制器,但不同的视图

如何将tabpanel的键从视图传递到控制器asp mvc

如何通过 2 个视图控制器传递 textfield.text 数据

使用情节提要(iOS)时如何将 NSManagedObjectContext 传递给视图控制器

如何将相同的viewmodel设置为xamarin表单中的新mvvm中的两个视图

如何通过 presentViewController 将对象传递到视图中?