繁体   English   中英

快速将TableView单元中的数据传递给视图控制器

[英]Swift Passing Data in a tableview cell to a view controller

我似乎遇到了一个问题,不知道我要去哪里错了。 我试图通过一个按钮将用户的帖子发送到另一个视图控制器,但我的应用不断崩溃。 下面是表格视图单元格和代码准备的代码。 我对应用程序开发领域还是陌生的。 因此,对不起,我的代码有些混乱。 另外,我正在使用Parse作为后端。 我不知道这有什么不同。

在此先感谢您!

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = self.tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! TimelineTableViewCell

        let userPost: PFObject = self.userObjects.objectAtIndex(indexPath.row) as! PFObject

        cell.backgroundColor = UIColor.darkGrayColor().colorWithAlphaComponent(0.2)
        cell.layer.borderColor = UIColor.lightGrayColor().CGColor
        cell.layer.borderWidth = 0.5
        cell.reportPost.tag = indexPath.row
        cell.reportPost.addTarget(self, action: "buttonAction", forControlEvents: .TouchUpInside)

//        Display Users Post's
        var userText = userPost["text"] as? String
        cell.TextLabel!.text = userText

//      Display Date and Time

        var Date: NSDateFormatter = NSDateFormatter()
        Date.dateFormat = "MM-dd HH:mm"
        cell.dateLabel.text = Date.stringFromDate(userPost.createdAt!)

//      Display username

        var findUser:PFQuery = PFUser.query()!
        let Id = userPost.objectForKey("username")?.objectId as NSString!
        findUser.whereKey("objectId", equalTo: Id)
        findUser.findObjectsInBackgroundWithBlock{
            (objects: [AnyObject]?, error: NSError?) -> Void in
            if error == nil{
                var user:PFUser = (objects as NSArray!).lastObject as! PFUser

                cell.userLabel.text = user.username

//              Getting User's Profile Image

                var initialThumbnail = UIImage(named: "PAHS_Logo")
                cell.userImage.image = initialThumbnail

                if let PhotoFile = user["ProfileImage"] as? PFFile {
                    PhotoFile.getDataInBackgroundWithBlock{
                        (ImageData:NSData?, error:NSError?)->Void in
                        if error == nil{
                            let Image:UIImage = UIImage(data: ImageData!)!
                            cell.userImage.image = Image
                        }else{
                            cell.userImage.image = initialThumbnail
                        }
                    }
                }
            }
        }

        return cell
    }


    func buttonAction(sender: UIButton!){
        let titleString = self.userObjects.objectAtIndex(sender.tag) as? String
        let firstActivityItem = "\(titleString)"
        let activityViewController: UIActivityViewController = UIActivityViewController(activityItems: [firstActivityItem], applicationActivities: nil)
        self.presentViewController(activityViewController, animated: true, completion: nil)
    }

    var valueToPass: String!

    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        let indexPath = tableView.indexPathForSelectedRow();
        let currentCell = tableView.cellForRowAtIndexPath(indexPath!) as UITableViewCell!;
        valueToPass = currentCell.textLabel?.text
        performSegueWithIdentifier("reportPost", sender: self)
    }

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if (segue.identifier == "reportPost")
        {
            var viewController: reportViewController = segue.destinationViewController as! reportViewController
            let indexPath = self.tableView!.indexPathsForSelectedRows();
            let titleString = userObjects.objectAtIndex(indexPath!.count) as! String
            viewController.titleString = titleString
            viewController.titleLabel.text = valueToPass  //fatal error: unexpectedly found nil while unwrapping an Optional value
            self.presentViewController(viewController, animated: true, completion: nil)
        }
    }

您可以将performSegueWithIdentifier("reportPost", sender: self)更改为performSegueWithIdentifier("reportPost", sender: indexPath)然后,在prepareForSegue()sender将成为indexPath。 您可以将prepareForSegue()更改为此:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
   if (segue.identifier == "reportPost")
   {
        var viewController: reportViewController = segue.destinationViewController as! reportViewController
        let indexPath = sender as! NSIndexPath
        let titleString = userObjects[indexPath.row] as! String // I am assuming userObjects is the object containing the data you want
        viewController.titleString = titleString
        let cell = tableView.cellForRowAtIndexPath(indexPath) as! UITableViewCell
        let valueToPass = cell.textLabel?.text
        viewController.titleLabel.text = valueToPass
        self.presentViewController(viewController, animated: true, completion: nil)
    }
}

如果这样做,可以摆脱var valueToPass: String! 以上tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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