2017-02-18 6 views
-1

Загружаю некоторую информацию из Firebase и храните эту информацию в моем классе аннотации. Затем я хочу передать эту информацию в переменные на следующем контроллере представления, чтобы табличное представление могло правильно загружаться. вместо сбоев, потому что значения возвращают нуль. Я использую кнопку аксессуара для вызова, чтобы начать сеанс. И я использую функцию calloutAccessoryControlTapped. Я понимаю, как передавать данные в целом с одного ViewController на другой, даже лучше, чем tableView, это уникально в том, что я использую аннотации MapKit, похожие на tableViewCells, но мне неизвестно эквивалент MapKit для indexRow. путь, который имеет tableViews.Как передать информацию, хранящуюся в аннотации MapKit, в новый контроллер представления при использовании prepareSegue

import Foundation 
import UIKit 
import MapKit 

class BookAnnotation: NSObject, MKAnnotation { 

var coordinate: CLLocationCoordinate2D 


var title: String? 
var Author:String? 
var Genre: String? 
var Comment: String? 
var User: String? 
var bookPhoto: String? 
var userID: String? 
var userPhoto: String? 
var userLocation: String? 
var bookRating: String? 
var pushingID: String? 
var bookLat: Double? 
var bookLng: Double? 



init(title: String, Author: String, Genre: String, Comment: String, User: String, bookPhoto: String, userID: String, userPhoto: String, userLocation: String, bookRating: String, pushingID: String, coordinate: CLLocationCoordinate2D){ 

    self.title = title 
    self.Author = Author 
    self.Genre = Genre 
    self.Comment = Comment 
    self.User = User 
    self.bookPhoto = bookPhoto 
    self.userID = userID 
    self.userPhoto = userPhoto 
    self.userLocation = userLocation 
    self.bookRating = bookRating 
    self.pushingID = pushingID 

    self.coordinate = coordinate 

    super.init() 
} 

var subtitle: String? { 
    return Comment 

} 


} 

Вот пример того, что было запрошено (некоторая разница в примечании. Вид передачи информации не Tableview это MapView, которая использует аннотацию, чтобы отобразить некоторую информацию и кнопочный детали Вспомогательные для пойти в следующий вид Controller, который является tableView.Таким образом, в этой функции я не могу использовать indexPath.row, и я не хранил вещи в словаре на этот раз, так как это довольно разный вид. Надеюсь, это имеет смысл):

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    super.prepare(for: segue, sender: sender) 




    if (segue.identifier == "moreInfo") { 


     //let navVC = segue.destinationViewController as! UINavigationController 

     let viewController = segue.destination as! MoreInfoViewController 

     let indexPath : IndexPath = self.tableView.indexPathForSelectedRow! 


     let moreInfoSnaphot: FIRDataSnapshot! = self.SecondResultArray[indexPath.row] 

     let moreInfoCells = moreInfoSnaphot.value as! Dictionary<String, String> 

     let AuthorInfo = moreInfoCells["Author"] as String! 
     let CommentInfo = moreInfoCells["Comment"] as String! 
     let GenreInfo = moreInfoCells["Genre"] as String! 
     let UserInfo = moreInfoCells["User"] as String! 
     let titleInfo = moreInfoCells["title"] as String! 
     let bookPhotoInfo = moreInfoCells["bookPhoto"] as String! 
     let userIDInfo = moreInfoCells["userID"] as String! 
     let userPIC = moreInfoCells["userPhoto"] as String! 
     let userLocation = moreInfoCells["userLocation"] as String! 
     let userToBePushed = moreInfoCells["pushingID"] as String! 

     print(userToBePushed) 


     userPictureURL = userPIC 



     // This posts the comment about the book in the info view 

     bookInfoSender = CommentInfo 

     //These two vars are to handel messageing and can be referenced later 
     userTobeMessaged = UserInfo 

     userToBeMessagedId = userIDInfo 

     //////////////////////////////////////// 

     // initialize new view controller and cast it as your view controller 

     // your new view controller should have property that will store passed value 
     viewController.bookComment = bookInfoSender 
     viewController.UserToBeContacted = UserInfo 
     viewController.UserContactedID = userToBeMessagedId 
     viewController.userPictureurl = userPictureURL 
     viewController.userLocate = userLocation 
     viewController.bookPictureLink = bookPhotoInfo 
     viewController.genreOfBook = GenreInfo 
     viewController.titleOfBook = titleInfo 
     viewController.userBeingPushedMSG = userToBePushed 

     print("THIS IS THE USER TO BE PUSHED \(userToBePushed)") 
    } 




} 
+0

Возможный дубликат [Передача данных между контроллерами View] (http://stackoverflow.com/questions/5210535/passing-data-between-view-controllers) – vikingosegundo

+0

Могу ли я увидеть ваш метод prepareforsegue? –

+0

@vikingosegundo Это не дубликат. Я знаю, как это сделать с помощью TableViews, но нет index.path, на который я могу положиться. Аннотации MapKit работают аналогичным образом, но я не нашел эквивалентного способа сделать это. –

ответ

0

Что для меня работает: если вы хотите передать переменную с именем userKey на следующий ViewController (NextVC):

var userKey = "" 

func mapView(_ mapView: MKMapView, annotationView view: MKAnnotationView, calloutAccessoryControlTapped control: UIControl) 
{ 
    let annotation = view.annotation as! CustomPointAnnotation // I use CustomPointAnnotation, could be MKPointAnnotation 
    let key = annotation.userkey! 
    self.userKey = key 
    performSegue(withIdentifier: "MapToNextVC", sender: self) 
} 

override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
{ 
    if segue.identifier == "MapToNextVC" 
    { 
     let destinationController = segue.destination as! NextVC 
     destinationController.userKey = self.userKey 
    } 
} 
Смежные вопросы