[英]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.