- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
因此,我尝试使用 Firebase 创建 Uber 的克隆,但我的 MapViewController
中一直出现错误,这是我的代码:
import UIKit
import MapKit
import CoreLocation
class MapViewController: UIViewController, MKMapViewDelegate, CLLocationManagerDelegate {
@IBOutlet weak var callUberBtn: UIButton!
@IBOutlet weak var myMap: MKMapView!
private var locationManager = CLLocationManager();
private var userLocation: CLLocationCoordinate2D?;
private var driverLocation: CLLocationCoordinate2D?;
private var timer = Timer();
private var canCallUber = true;
private var riderCanceledRequest = false;
private var appStartedForTheFirstTime = true;
override func viewDidLoad() {
super.viewDidLoad()
initializeLocationManager();
UberHandler.Instance.observeMessagesForRider();
UberHandler.Instance.delegate = self; //Cannot assign value of type 'mapViewController' to type 'UberController?'
}
private func initializeLocationManager() {
locationManager.delegate = self;
locationManager.desiredAccuracy = kCLLocationAccuracyBest;
locationManager.requestWhenInUseAuthorization();
locationManager.startUpdatingLocation();
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
// if we have the coordinates from the manager
if let location = locationManager.location?.coordinate {
userLocation = CLLocationCoordinate2D(latitude: location.latitude, longitude: location.longitude)
let region = MKCoordinateRegion(center: userLocation!, span: MKCoordinateSpan(latitudeDelta: 0.01, longitudeDelta: 0.01));
myMap.setRegion(region, animated: true);
myMap.removeAnnotations(myMap.annotations);
if driverLocation != nil {
if !canCallUber {
let driverAnnotation = MKPointAnnotation();
driverAnnotation.coordinate = driverLocation!;
driverAnnotation.title = "Driver Location";
myMap.addAnnotation(driverAnnotation);
}
}
let annotation = MKPointAnnotation();
annotation.coordinate = userLocation!;
annotation.title = "Drivers Location";
myMap.addAnnotation(annotation);
}
}
func updateRidersLocation() {
UberHandler.Instance.updateRiderLocation(lat: userLocation!.latitude, long: userLocation!.longitude);
}
func canCallUber(delegateCalled: Bool) {
if delegateCalled {
callUberBtn.setTitle("Cancel Uber", for: UIControlState.normal);
canCallUber = false;
} else {
callUberBtn.setTitle("Call Uber", for: UIControlState.normal);
canCallUber = true;
}
}
func driverAcceptedRequest(requestAccepted: Bool, driverName: String) {
if !riderCanceledRequest {
if requestAccepted {
alertTheUser(title: "Uber Accepted", message: "\(driverName) Accepted Your Uber Request")
} else {
UberHandler.Instance.cancelUber();
timer.invalidate();
alertTheUser(title: "Uber Canceled", message: "\(driverName) Canceled Uber Request")
}
}
riderCanceledRequest = false;
}
func updateDriversLocation(lat: Double, long: Double) {
driverLocation = CLLocationCoordinate2D(latitude: lat, longitude: long);
}
@IBAction func callUber(_ sender: Any) {
if userLocation != nil {
if canCallUber {
UberHandler.Instance.requestUber(latitude: Double(userLocation!.latitude), longitude: Double(userLocation!.longitude))
timer = Timer.scheduledTimer(timeInterval: TimeInterval(10), target: self, selector: #selector(MapViewController.updateRidersLocation), userInfo: nil, repeats: true);
} else {
riderCanceledRequest = true;
UberHandler.Instance.cancelUber();
timer.invalidate();
}
}
}
private func alertTheUser(title: String, message: String) {
let alert = UIAlertController(title: title, message: message, preferredStyle: .alert);
let ok = UIAlertAction(title: "OK", style: .default, handler: nil);
alert.addAction(ok);
present(alert, animated: true, completion: nil);
}
}
UberController?
在另一个 Swift 文件中声明,这是它的代码:
import Foundation
import FirebaseDatabase
protocol UberController: class {
func canCallUber(delegateCalled: Bool);
func driverAcceptedRequest(requestAccepted: Bool, driverName: String);
func updateDriversLocation(lat: Double, long: Double);
}
class UberHandler {
private static let _instance = UberHandler();
weak var delegate: UberController?;
var rider = "";
var driver = "";
var rider_id = "";
static var Instance: UberHandler {
return _instance;
}
func observeMessagesForRider() {
// RIDER REQUESTED UBER
DBProvider.Instance.requestRef.observe(DataEventType.childAdded) { (snapshot: DataSnapshot) in
if let data = snapshot.value as? NSDictionary {
if let name = data[Constants.NAME] as? String {
if name == self.rider {
self.rider_id = snapshot.key;
self.delegate?.canCallUber(delegateCalled: true);
}
}
}
}
// RIDER CANCELED UBER
DBProvider.Instance.requestRef.observe(DataEventType.childRemoved) { (snapshot: DataSnapshot) in
if let data = snapshot.value as? NSDictionary {
if let name = data[Constants.NAME] as? String {
if name == self.rider {
self.delegate?.canCallUber(delegateCalled: false);
}
}
}
}
// DRIVER ACCEPTED UBER
DBProvider.Instance.requestAcceptedRef.observe(DataEventType.childAdded) { (snapshot: DataSnapshot) in
if let data = snapshot.value as? NSDictionary {
if let name = data[Constants.NAME] as? String {
if self.driver == "" {
self.driver = name;
self.delegate?.driverAcceptedRequest(requestAccepted: true, driverName: self.driver);
}
}
}
}
// DRIVER CANCELED UBER
DBProvider.Instance.requestAcceptedRef.observe(DataEventType.childRemoved) { (snapshot:DataSnapshot) in
if let data = snapshot.value as? NSDictionary {
if let name = data[Constants.NAME] as? String {
if name == self.driver {
self.driver = "";
self.delegate?.driverAcceptedRequest(requestAccepted: false, driverName: name);
}
}
}
}
// DRIVER UPDATING LOCATION
DBProvider.Instance.requestAcceptedRef.observe(DataEventType.childChanged) { (snapshot: DataSnapshot) in
if let data = snapshot.value as? NSDictionary {
if let name = data[Constants.NAME] as? String {
if name == self.driver {
if let lat = data[Constants.LATITUDE] as? Double {
if let long = data[Constants.LONGITUDE] as? Double {
self.delegate?.updateDriversLocation(lat: lat, long: long);
}
}
}
}
}
}
}
func requestUber(latitude: Double, longitude: Double) {
let data: Dictionary<String, Any> = [Constants.NAME: rider, Constants.LATITUDE: latitude, Constants.LONGITUDE: longitude];
DBProvider.Instance.requestRef.childByAutoId().setValue(data);
} // request uber
func cancelUber() {
DBProvider.Instance.requestRef.child(rider_id).removeValue();
}
func updateRiderLocation(lat: Double, long: Double) {
DBProvider.Instance.requestRef.child(rider_id).updateChildValues([Constants.LATITUDE: lat, Constants.LONGITUDE: long]);
}
}
我的错误是:无法将类型“mapViewController”的值分配给
。我不知道我做错了什么。有什么想法吗?mapViewController
中的类型“UberController?”
最佳答案
你必须声明你的 MapViewController
符合 UberController
协议(protocol),就像你声明符合 MapViewDelegate
和 CLLocationManagerDelegate
协议(protocol)。
或者:
class MapViewController: UIViewController, MKMapViewDelegate, CLLocationManagerDelegate, UberController {
...
}
或者,甚至更好:
class MapViewController: UIViewController {
...
}
extension MapViewController: MKMapViewDelegate {
// MKMapViewDelegate methods here
}
extension MapViewController: CLLocationManagerDelegate {
// CLLocationManagerDelegate methods here
}
extension MapViewController: UberController {
// UberController methods here
}
关于ios - 无法将类型 'MapViewController' 的值分配给类型 'UberController?',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45332778/
我正在尝试编写一个相当多态的库。我遇到了一种更容易表现出来却很难说出来的情况。它看起来有点像这样: {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE
谁能解释一下这个表达式是如何工作的? type = type || 'any'; 这是否意味着如果类型未定义则使用“任意”? 最佳答案 如果 type 为“falsy”(即 false,或 undef
我有一个界面,在IAnimal.fs中, namespace Kingdom type IAnimal = abstract member Eat : Food -> unit 以及另一个成功
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: What is the difference between (type)value and type(va
在 C# 中,default(Nullable) 之间有区别吗? (或 default(long?) )和 default(long) ? Long只是一个例子,它可以是任何其他struct类型。 最
假设我有一个案例类: case class Foo(num: Int, str: String, bool: Boolean) 现在我还有一个简单的包装器: sealed trait Wrapper[
这个问题在这里已经有了答案: Create C# delegate type with ref parameter at runtime (1 个回答) 关闭 2 年前。 为了即时创建委托(dele
我正在尝试获取图像的 dct。一开始我遇到了错误 The function/feature is not implemented (Odd-size DCT's are not implemented
我正在尝试使用 AFNetworking 的 AFPropertyListRequestOperation,但是当我尝试下载它时,出现错误 预期的内容类型{( “应用程序/x-plist” )}, 得
我在下面收到错误。我知道这段代码的意思,但我不知道界面应该是什么样子: Element implicitly has an 'any' type because index expression is
我尝试将 SignalType 从 ReactiveCocoa 扩展为自定义 ErrorType,代码如下所示 enum MyError: ErrorType { // .. cases }
我无法在任何其他问题中找到答案。假设我有一个抽象父类(super class) Abstract0,它有两个子类 Concrete1 和 Concrete1。我希望能够在 Abstract0 中定义类
我想知道为什么这个索引没有用在 RANGE 类型中,而是用在 INDEX 中: 索引: CREATE INDEX myindex ON orders(order_date); 查询: EXPLAIN
我正在使用 RxJava,现在我尝试通过提供 lambda 来订阅可观察对象: observableProvider.stringForKey(CURRENT_DELETED_ID) .sub
我已经尝试了几乎所有解决问题的方法,其中包括。为 提供类型使用app.use(express.static('public'))还有更多,但我似乎无法为此找到解决方案。 index.js : imp
以下哪个 CSS 选择器更快? input[type="submit"] { /* styles */ } 或 [type="submit"] { /* styles */ } 只是好
我不知道这个设置有什么问题,我在 IDEA 中获得了所有注释(@Controller、@Repository、@Service),它在行号左侧显示 bean,然后转到该 bean。 这是错误: 14-
我听从了建议 registering java function as a callback in C function并且可以使用“简单”类型(例如整数和字符串)进行回调,例如: jstring j
有一些 java 类,加载到 Oracle 数据库(版本 11g)和 pl/sql 函数包装器: create or replace function getDataFromJava( in_uLis
我已经从 David Walsh 的 css 动画回调中获取代码并将其修改为 TypeScript。但是,我收到一个错误,我不知道为什么: interface IBrowserPrefix { [
我是一名优秀的程序员,十分优秀!