2016-04-14 18 views
0

私はSwiftには新しく、代議員を使用する際に問題があります。ユーザーがAdminAddCatTableViewControllerのテーブル行をタップすると、AdminViewControllerのユーザーの現在の場所にあるピンをマップ上にドロップしたいので、デリゲートを使用してこれを実行しようとしています。ピンが落ちないので、明らかに私のコードに何か問題があります。 AdminAddCatTableViewControllerでiOS Swift代理人

、私はAdminViewControllerで

import UIKit 
import Firebase 

protocol AddCatDelegate: class { 
    func addPin(sender: AdminAddCatTableViewController) 
} 

class AdminAddCatTableViewController: UITableViewController { 

weak var delegate:AddCatDelegate? 

let admin = "secret-number" 
let ref = Firebase(url: "firease_url") 

@IBOutlet weak var snowballGPSLabel: UILabel! 
@IBOutlet weak var smokeyGPSLabel: UILabel! 
@IBOutlet weak var shadowGPSLabel: UILabel! 
@IBOutlet weak var spotsGPSLabel: UILabel! 
@IBOutlet weak var sunnyGPSLabel: UILabel! 

var catRefArray: [AnyObject] = [] 

var coord:String = "" 

let shareData = ShareData.sharedInstance 

func updateCoord() { 
    if let bar = self.shareData.someString { 
     self.coord = bar 
    } 

} 


override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 

    NSTimer.scheduledTimerWithTimeInterval(0.5, target: self, selector: "updateCoord", userInfo: nil, repeats: true) 

    var catNameArray: [AnyObject] = [] 

    catNameArray.append("Snowball") 
    catNameArray.append("Smokey") 
    catNameArray.append("Shadow") 
    catNameArray.append("Spots") 
    catNameArray.append("Sunny") 


    for i in 0...4 { 
     catRefArray.append(self.ref.childByAppendingPath("admin").childByAppendingPath(self.admin).childByAppendingPath(catNameArray[i] as! String)) 
    } 

    catRefArray[0].observeEventType(.Value, withBlock: { snapshot in 
     if let value:String = snapshot.value as? String { 
      self.snowballGPSLabel.text = value 
     } 
    }, withCancelBlock: { error in 
      print(error.description) 
// same for the other rows 
    }) 
} 

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
    if (indexPath.row == 0) { 
     let ref0 = self.ref.childByAppendingPath("admin").childByAppendingPath(self.admin) 
     ref0.updateChildValues(["Snowball": self.coord]) 
     delegate?.addPin(self) 
    } 
// same for other rows 
} 

を持って、私はまあ、あなたのAdminAddCatTableViewControllerにデリゲートを設定することはありませんので、それは常にnilであると呼ばれることはありません

import UIKit 
import MapKit 
import CoreLocation 

class AdminViewController: UIViewController, CLLocationManagerDelegate, MKMapViewDelegate { 


@IBAction func logOutDidTouch(sender: AnyObject) { 
    performSegueWithIdentifier("adminToLogin", sender: self) 
} 

@IBOutlet weak var mapView: MKMapView! 

var locationManager: CLLocationManager! 
var previousLocation : CLLocation! 

var latitude = 0.0; 
var longitude = 0.0; 

//Declare Class Variable 

let shareData = ShareData.sharedInstance 


override func viewDidLoad() { 
    super.viewDidLoad() 

    //On loading the screen the map kit view is shown and the current location is found and is being updated. 
    locationManager = CLLocationManager() 
    locationManager.desiredAccuracy = kCLLocationAccuracyBest; 
    locationManager.delegate = self; 

    let status = CLLocationManager.authorizationStatus() 
    if status == .NotDetermined || status == .Denied || status == .AuthorizedWhenInUse { 
     locationManager.requestAlwaysAuthorization() 
     locationManager.requestWhenInUseAuthorization() 
    } 
    locationManager.startUpdatingLocation() 
    locationManager.startUpdatingHeading() 



    mapView.delegate = self 
    mapView.showsUserLocation = true 
    mapView.mapType = MKMapType(rawValue: 0)! 
    mapView.userTrackingMode = MKUserTrackingMode(rawValue: 2)! 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
    mapView.mapType = MKMapType(rawValue: 0)! 
} 

override func viewWillAppear(animated: Bool) { 
    //updates the location 
    locationManager.startUpdatingHeading() 
    locationManager.startUpdatingLocation() 
} 

override func viewWillDisappear(animated: Bool) { 
    locationManager.stopUpdatingHeading() 
    locationManager.stopUpdatingLocation() 
} 
func locationManager(manager: CLLocationManager, didUpdateToLocation newLocation: CLLocation, fromLocation oldLocation: CLLocation) { 

    self.latitude = newLocation.coordinate.latitude 
    self.longitude = newLocation.coordinate.longitude 

    self.shareData.someString = "\(self.latitude)" + "," + "\(self.longitude)" 
    print(self.shareData.someString) 
} 
} 

extension AdminViewController: AddCatDelegate { 
func addPin(sender:AdminAddCatTableViewController) { 
    // drop a pin 
    self.mapView.delegate = self 
    let coordinate = mapView.userLocation.coordinate 
    let dropPin = MKPointAnnotation() 
    dropPin.coordinate = coordinate 
    dropPin.title = "Cat" 
    mapView.addAnnotation(dropPin) 
} 
} 
+0

あなたはAdminViewControllerからAdminAddCatTableViewControllerにsegueingしている場合、あなたはsegueingながら自己にAdminAddCatTableViewControllerのデリゲートプロパティを設定する必要があります..:デリゲートを設定するには、あなたのAdminViewControllerでこのような何かを実装します、単に、セグエ法準備先コントローラを取得しprepareForSegue funcを自己 – muneeb

+0

上書きするデリゲートプロパティを設定する実装(セグエ:UIStoryboardSegue、送信者:ANYOBJECT){ {segue.identifier ==「識別子」IF dvc = segue.destinationViewControllerを? AdminAddCatTableViewController dvc?.delegate = self } } – muneeb

+0

あなたは 'delegate'を設定しないので、nilです。 'delegate?.addPin(self)'は何もしません。 – ryantxr

答えて

0

を持っています。

なぜAdminViewControllerの拡張機能がありますか?拡張機能を削除し、AdminViewControllerにデリゲートを実装させるだけです。あなたはストーリーボードでセグエを定義した場合

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    super.prepareForSegue(segue, sender: sender) 

    if segue.identifier == "YourSegueIdentifier" { 
     if let vc = segue.destinationViewController as? AdminAddCatTableViewController { 
      vc.delegate = self 
     } 
    } 
}