【问题标题】:One class instantiation swift share between View Controllers视图控制器之间的一类实例化快速共享
【发布时间】:2014-10-14 11:35:59
【问题描述】:

我很难做到这一点。我拥有的是一个带有多个视图控制器的 NavigationController。在第一个 View Controller 中,我实例化了一个新类 GPSTrackingManager:

var tracking = GPSTrackingManager()

因为我需要此 UINavController 之后所有视图控制器中可用的 GPS 数据和功能。我已经在第一个 VC 中调用了这个,以便 GPS 可以尽早修复。如何将此跟踪对象传递给新的视图控制器?我在 prepareForSegue 中尝试了几件事,但我目前没有想法。如果我将上面的代码放在新的 VC 中,那么我的 startUpdatingLocation() 运行了 2 次。如果您能指出我正确的方向,将不胜感激!

【问题讨论】:

    标签: ios xcode swift gps core-location


    【解决方案1】:

    我认为最合适的解决方案(不要太过分,因为肯定有更彻底的方法可以解决这个问题)是将 gps 管理分离到它自己的单例类中,并订阅 trackerUpdated 协议以进行更新。

    import Foundation
    import placeWhereGPSTrackingManagerIs
    
    protocol GPSManagerDelegate {
        func didUpdateTracker(tracker: yourTrackerObject)
    }
    
    
    let _GPSManagerSharedInstance = GPSManager()
    
    
    
    class GPSManager {
    
    weak var delegate: GPSManagerDelegate?
    let tracker: yourTrackerObject?
    
    class var sharedInstance:GPSManager {
        return _GPSManagerSharedInstance
    }
    
    init() {
        tracker = GPSTrackingManager()
        tracker.startUpdatingLocation()
    }
    
    func updateTracker(newInformation) // you'll want to pass whatever information your tracker needs here
    {
        tracker.trackerProperty = newInformation
        self.delegate?.didUpdateTracker(tracker)
    }
    
    }
    

    Swift 单例解释 Using a dispatch_once singleton model in Swift

    现在,无论 startUpdatingLocation 做什么,都可以使用更新跟踪器所需的新信息调用此类中的 updateTracker。您还可以将该逻辑迁移到此处(我建议在这种情况下这样做),因此所有内容都包含在一个类中。

    任何对信息感兴趣的视图控制器都可以订阅 didUpdateTracker 协议方法,该方法会将跟踪器传递给该视图控制器

    import UIKit
    
    
    class controllerOne: UIViewController, GPSManagerDelegate {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        GPSManager.sharedInstance.delegate = self // set the GPSManager delegate
        if let tracker = GPSManager.sharedInstance.tracker {
        // if the tracker exists, we assign it to the "tracker" variable, and use as needed
        // setup page with tracker
    
        }
    
    }
    
    func didUpdateTracker(updatedTracker: yourTrackerObject) {
        // protocol method that will be called from the gpsmanager everytime it updates
        // do whatever updates to the page with the 
    }
    
    }
    

    由于您只能拥有一个 GPSManager 并且其 tracker 属性无法更改,因此向 GPS 管理器询问此跟踪器始终是安全的,该跟踪器仅在其初始化时调用 startUpdatingLocation()

    您还可以像@shesh nath 提到的那样发布通知,如果您更喜欢委托方法,这是一种广播更改的完全有效的方法。无论您采用哪种方式,我都建议将跟踪器与视图控制器分开,以便视图控制器不是负责管理跟踪器状态的控制器。

    【讨论】:

    • 谢谢 :) 我使用您的示例将其构建到我的课程中,现在它运行良好。我可以从所有视图控制器中的 GPSTrackingManager 访问值,而无需创建新的(重复)实例。我将阅读更多关于 Swift 协议的内容。
    • 太棒了!很高兴我能提供帮助,
    【解决方案2】:

    有几种方法可以实现它 1) 使用 Key-Value 观察者 2) 通知

    通知示例是在您的第一个 viewController 发布通知并将您的数据传递给此通知。

    NSDictionary *data;
     [[NSNotificationCenter defaultCenter] postNotificationName:@"updateBeaconStateOnDetailScreen" object:data];
    

    并在剩下的所有视图控制器上注册此通知的侦听器,以查看 viewdidload 示例。

            [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateBeaconState:)name:@"updateBeaconStateOnDetailScreen" object:nil];
    

    您将被此通知调用的方法是

      -(void) updateBeaconState:(NSNotification *) notification
     {   //notification raised from BeaconList with updated Beacon State
        NSDictionary *dictUpdatedBeacon=[notification valueForKey:@"object"];
     }
    

    【讨论】:

      猜你喜欢
      • 2016-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-23
      • 2021-10-04
      • 1970-01-01
      • 2018-01-23
      相关资源
      最近更新 更多