2016-04-14 28 views
0

Swift için çok yeniyim ve delegeleri kullanarak sorun yaşıyorum. Kullanıcı AdminAddCatTableViewController'da bir tablo satırına dokunduğunda, haritada geçerli konumdaki AdminViewController'da bir pin bırakmak istiyorum ve bunu bir temsilci kullanarak yapmaya çalışıyorum. Açıkçası, kodun düşmemesi nedeniyle kodumda bir sorun var. AdminAddCatTableViewController yılında iOS Swift delegeleri

, ben AdminViewController yılında

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 
} 

var, Iyi asla AdminAddCatTableViewController üzerinde temsilci ayarlarken

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

Eğer AdminAddCatTableViewController için AdminViewController gelen segueing yapıyorsanız, segueing ederken .. self AdminAddCatTableViewController delegesi özelliğini ayarlamak zorunda: Yetki verilen AdminViewController böyle bir şey uygulamak ayarlamak için sadece hedef denetleyici olsun, segue yöntemine hazırlanmak uygulamak ve prepareForSegue fonk kendine – muneeb

+0

geçersiz kılmayı temsilci özelliğini ayarlayın (segue: UIStoryboardSegue, gönderen:? AnyObject) { segue.identifier == "Kimliğin" eğer { dvc = segue.destinationViewController olarak izin verilsin mi? AdminAddCatTableViewController dvc? .delegate = kendiliğinden } } – muneeb

+0

"Temsilci" yi ayarlamıyorsunuz, böylece sıfır değil. “delege? .addPin (kendini)” hiçbir şey yapmaz. – ryantxr

cevap

0

var, bu yüzden her zaman sıfır ve asla denilen olduğunu.

Neden bir AdminViewController uzantınız var? Sadece uzantıyı kaldırın ve AdminViewController temsilci uygulamak. Film şeridinde segue tanımladıysanız

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 
     } 
    } 
}