简体   繁体   中英

Showing detail view when cell tapped Swift Parse

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM