So as the title says I'm trying to show a detail view when a cell is tapped. My issue is with the prepareForSegue function I'm using. I don't get any errors but when I run on the simulator I get an uncaught exception. It occurs on the last line of the prepareForSegue function. Its finding nil for the names and I'm not sure why the variable is nil. Any help would be much appreciated.
UPDATE: The uncaught error is no longer a problem. Now the data is not being displayed when the cell is tapped.
class LocalPostsTableViewController: UITableViewController, UINavigationBarDelegate {
var currentIndexPath: NSIndexPath?
func displayAlert(title: String, message: String) {
var alert = UIAlertController(title: title, message: message, preferredStyle: UIAlertControllerStyle.Alert)
alert.addAction(UIAlertAction(title: "Ok", style: .Default, handler: { (action) -> Void in
}))
self.presentViewController(alert, animated: true, completion: nil)
}
var names = [String]()
var locations = [String]()
var dates = [String]()
var imageFiles = [PFFile]()
var abouts = [String]()
override func viewDidLoad() {
super.viewDidLoad()
PFGeoPoint.geoPointForCurrentLocationInBackground { (geoPoint, error) -> Void in
if let geoPoint = geoPoint {
PFUser.currentUser()?["location"] = geoPoint
PFUser.currentUser()?.saveInBackground()
var getLocalPostsQuery = PFQuery(className: "publicPosts")
if let latitude = PFUser.currentUser()!["location"].latitude {
if let longitude = PFUser.currentUser()!["location"].longitude {
getLocalPostsQuery.whereKey("searchLocation", withinGeoBoxFromSouthwest: PFGeoPoint(latitude: latitude - 0.5, longitude: longitude - 0.5), toNortheast: PFGeoPoint(latitude: latitude + 0.5, longitude: longitude + 0.5))
getLocalPostsQuery.findObjectsInBackgroundWithBlock { (objects, error) -> Void in
if let objects = objects {
self.names.removeAll(keepCapacity: true)
self.locations.removeAll(keepCapacity: true)
self.abouts.removeAll(keepCapacity: true)
self.dates.removeAll(keepCapacity: true)
self.imageFiles.removeAll(keepCapacity: true)
for object in objects {
self.names.append(object["name"] as! String)
self.locations.append(object["location"] as! String)
self.dates.append(object["date"] as! String)
self.abouts.append(object["about"] as! String)
self.imageFiles.append(object["imageFile"] as! PFFile)
self.tableView.reloadData()
}
}
}
}
}
}
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
// MARK: - Table view data source
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
// #warning Incomplete implementation, return the number of sections
return 1
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// #warning Incomplete implementation, return the number of rows
return names.count
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let LECell = tableView.dequeueReusableCellWithIdentifier("LocalPostsCell", forIndexPath: indexPath) as! LocalPostsTableViewCell
imageFiles[indexPath.row].getDataInBackgroundWithBlock { (data, error) -> Void in
if let downloadedImage = UIImage(data: data!) {
LECell.postImage.image = downloadedImage
}
}
LECell.postName.text = names[indexPath.row]
LECell.postLocation.text = locations[indexPath.row]
LECell.postDate.text = dates[indexPath.row]
return LECell
}
let localPostsDetailSegue = "showLocalPostsDetailView"
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == localPostsDetailSegue {
let detailScene = segue.destinationViewController as! LocalPostsDetailViewController
if let indexPath = self.tableView.indexPathForSelectedRow {
let row = Int(indexPath.row)
detailScene.postName?.text = names[row]
}
}
}
}
You should just pass string to next controller and set this text to label in viewDidLoad
of next screen.
Define:
var postName: String!
in LocalPostsDetailViewController
and in prepareForSegue
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == localPostsDetailSegue {
let detailScene = segue.destinationViewController as! LocalPostsDetailViewController
if let indexPath = self.tableView.indexPathForSelectedRow {
let row = Int(indexPath.row)
detailScene.postName = names[row]
}
}
}
In viewDidLoad
of LocalPostsDetailViewController
set it:
self.postName?.text = postName
There is no need on using didSelectRowAtIndexPath
. Just define the segue in the storyBoard with the identifier and the following should work:
let localPostsDetailSegue = "showLocalPostsDetailView"
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == localPostsDetailSegue {
let detailScene = segue.destinationViewController as! LocalPostsDetailViewController
if let indexPath = self.tableView.indexPathForSelectedRow {
let row = Int(indexPath.row)
detailScene.postName?.text = names[row]
}
}
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.