簡體   English   中英

視圖控制器之間的一類實例化快速共享

[英]One class instantiation swift share between View Controllers

我在解決這個問題時遇到了麻煩。 我所擁有的是帶有幾個視圖控制器的NavigationController。 在第一個View Controller中,我實例化了一個新類GPSTrackingManager:

var tracking = GPSTrackingManager()

因為在此UINavController之后,我需要所有視圖控制器中可用的GPS數據和功能。 我已經在第一個VC中稱呼它,因此GPS可以盡早解決。 如何將該跟蹤對象傳遞給新的視圖控制器? 我在prepareForSegue中嘗試了幾件事,但目前我沒有主意。 如果我將上面的代碼放在新的VC中,則我將運行startUpdatingLocation()2次。 如果您能指出正確的方向,將不勝感激!

我認為最合適的解決方案(不要太過分,因為肯定有更徹底的解決此問題的方法)是將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單例解釋在Swift中使用dispatch_once單例模型

現在,無論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,並且無法更改其跟蹤器屬性,因此始終可以向GPS管理器詢問此跟蹤器,該跟蹤器僅在初始化時調用startUpdatingLocation()

您也可以像@shesh nath所提到的那樣發布通知,如果您更喜歡委托方法,則這是廣播更改的一種完全有效的方法。 無論采用哪種方式,我都建議將跟蹤器與視圖控制器分開,以便視圖控制器不是負責管理跟蹤器狀態的控制器。

有幾種方法可以實現它,例如1)使用鍵值觀察器2)通知

通知示例在您的第一個viewController發布通知上,並將您的數據傳遞給該通知。

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

在左側的所有viewcontroller注冊偵聽器中,此通知在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"];
 }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM