来自UITableViewController的按钮将数据发送到detailViewController - swift

时间:2016-09-26 13:37:39

标签: ios swift uitableview segue

我有一个问题,我无法绕过头..你不能在UITableViewController中创建一个按钮动作..所以我试图控制+从按钮拖动到detailtableViewController并按下推..但是当我使用prepareForSegue然后我点击按钮它应该将按钮文本发送到detailtableViewController中的字符串,但有时它不是正确的名称,因为tableView中有多个单元格,名称并不总是相同。

当我点击按钮"按钮时,我需要做的是: enter image description here

它应该转到这个detailtableViewController: enter image description here

将名称设置为Button的文本。 应该接收按钮名称的变量名为viaSegue,它是一个字符串。

我的UITableViewController:

    class feedTableViewController: UITableViewController, PostCellDelegate {



        @IBOutlet weak var loadingSpinner: UIActivityIndicatorView!
        @IBOutlet weak var profilePicture: UIImageView!


        var sendName = "No name"
        var facebookProfileUrl = ""
        var dbRef: FIRDatabaseReference!
        var updates = [Sweet]()
        var gottenUserId : Bool? = false
        var gottenUserIdWorkout : Bool? = false

        override func viewDidLoad() {
            super.viewDidLoad()

            let logoImage = UIImageView(frame: CGRect(x:0, y:0, width: 60, height: 32))
            logoImage.contentMode = .ScaleAspectFit

            let logo = UIImage(named: "logo.png")
            logoImage.image = logo
            self.navigationItem.titleView = logoImage



            loadingSpinner.startAnimating()


            if let user = FIRAuth.auth()?.currentUser {

                let userId = user.uid


                let storage = FIRStorage.storage()

                // Refer to your own Firebase storage
                let storageRef = storage.referenceForURL("**********")

                let profilePicRef = storageRef.child(userId+"/profile_pic.jpg")

                // Download in memory with a maximum allowed size of 1MB (1 * 1024 * 1024 bytes)
                profilePicRef.dataWithMaxSize(1 * 300 * 300) { (data, error) -> Void in
                    if (error != nil) {
                        // Uh-oh, an error occurred!
                        print("Unable to download image")
                    } else {
                        // Data for "images/island.jpg" is returned
                        // ... let islandImage: UIImage! = UIImage(data: data!)
                        if (data != nil){
                            self.profilePicture.image = UIImage(data: data!)
                            self.profilePicture.layer.cornerRadius = self.profilePicture.frame.size.width/2
                            self.profilePicture.clipsToBounds = true

                        }
                    }
                }


            }

            dbRef = FIRDatabase.database().reference().child("feed-items")
            startObersvingDB()

            tableView.rowHeight = UITableViewAutomaticDimension
            tableView.estimatedRowHeight = 205
        }

        func startObersvingDB() {
            FIRDatabase.database().reference().child("feed-items").queryOrderedByChild("date").observeEventType(.Value, withBlock: { (snapshot: FIRDataSnapshot) in
                var newUpdates = [Sweet]()

                for update in snapshot.children {
                    let updateObject = Sweet(snapshot: update as! FIRDataSnapshot)
                    newUpdates.append(updateObject)

                }

                self.updates = newUpdates.reverse()
                self.tableView.reloadData()


            }) { (error: NSError) in
                print(error.description)
            }
        }





        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()

        }












        // MARK: - Table view data source

        override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
            return 1
        }

        override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            return updates.count
        }


        protocol PostCellDelegate: class {
            func postCell(postCell: PostCell, didTouchUpInside button: UIButton)
        }


        func postCell(postCell: PostCell, didTouchUpInside button: UIButton) {
            let identifier = "toDetailtableViewController"
            let username = postCell.nameButton.titleLabel?.text
            performSegue(withIdentifier: identifier, sender: username)
        }






        override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

// Lots of stuff happening here

我的自定义单元格:

class updateTableViewCell: UITableViewCell {

    @IBOutlet weak var updateLabel: UILabel!
    @IBOutlet weak var picView: UIImageView!
    @IBOutlet weak var likesLabel: UILabel!
    @IBOutlet weak var likeButton: UIButton!
    @IBOutlet weak var hand: UIImageView!
    @IBOutlet weak var dateLabel: UILabel!

    @IBOutlet weak var nameButton: UIButton!


    weak var delegate: PostCellDelegate?

    var pathDB : String!
    var dbRef: FIRDatabaseReference!
    var gottenUserId : Bool? = false
    var sendNameCell = "No name here"




    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code

    }

    override func setSelected(selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }

    @IBAction func likeTapped(sender: AnyObject) {
        //print(pathDB)
        checkClickOnLikeButton()


    }


    @IBAction func didTouchUpInsideButton(sender: AnyObject) {
        delegate?.postCell(self, didTouchUpInside: button)
    }




    func checkClickOnLikeButton() {
        let dataPathen = self.pathDB
        // print(dataPathen)


        if let user = FIRAuth.auth()?.currentUser {

            let userId = user.uid



            FIRDatabase.database().reference().child("feed-items").child(dataPathen).child("likesForPost").observeSingleEventOfType(.Value, withBlock: { (snapshot) in
                // Get user value
                self.gottenUserId = snapshot.value![userId] as? Bool

                // print(self.gottenUserId)

                if self.gottenUserId == true {
                    print("Der er trykket high five før")
                    FIRDatabase.database().reference().child("feed-items").child(dataPathen).child("likesForPost").child(userId).removeValue()
                    let greyButtonColor = UIColor(red: 85/255, green: 85/255, blue: 85/255, alpha: 1.0)
                    self.likeButton.setTitleColor(greyButtonColor, forState: UIControlState.Normal)
                    self.hand.image = UIImage(named: "high.png")
                } else {
                    print("Der er IKKE trykket like før")
                    let quoteString = [userId: true]
                    FIRDatabase.database().reference().child("feed-items").child(dataPathen).child("likesForPost").updateChildValues(quoteString)
                    let blueButtonColor = UIColor(red: 231/255, green: 45/255, blue: 60/255, alpha: 1.0)
                    self.likeButton.setTitleColor(blueButtonColor, forState: UIControlState.Normal)
                    self.hand.image = UIImage(named: "highfive.png")
                }


                // ...
            }) { (error) in
                print(error.localizedDescription)
            }



        }

    }









}

1 个答案:

答案 0 :(得分:0)

假设您已经为包含Button的单元格创建了自定义类,则必须为@IBAction事件创建didTouchUpInside。您还必须直接从UITableViewControllerdetailtableViewController创建一个segue(因此不能从按钮或视图,从一个视图控制器到另一个视图控制器)。你需要给这个segue一个标识符,因为我们将手动执行它。

一旦你联系了单元格中的@IBAction,我们就需要一种从单元格中执行segue的方法。为此,我们需要引用UITableViewController。我们可以使用代表或响应者来获取它,最近我一直在使用响应者。

代表

UITableViewController创建符合的协议。

protocol PostCellDelegate: class {
    func postCell(_ postCell: PostCell, didTouchUpInside button: UIButton)
}

在自定义单元格类中创建一个委托变量,从该按钮didTouchUpInside为该事件调用@IBAction方法。

weak var delegate: PostCellDelegate?

@IBAction func didTouchUpInsideButton() {
    delegate?.postCell(self, didTouchUpInside: button)
}

现在在UITableViewController中,您必须符合代理人并在cellForRowAt方法中设置单元格的委托。

class tableViewController: UITableViewController, PostCellDelegate {

    //...

    // MARK: PostCellDelegate

    func postCell(_ postCell: PostCell, didTouchUpInside button: UIButton) {
        let identifier = "toDetailtableViewController"
        let username = postCell.button.titleLabel?.text
        performSegue(withIdentifier: identifier, sender: username)
    }

    //...

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        ...
        cell.delegate = self
        return cell
    }

    //...

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

        super.prepare(for: segue, sender: sender)

        switch (segue.destination, sender) {
        case let (controller as detailtableViewController, username as String):
            controller.usernameTextField.text = username
            break
        default:
            break
        }
    }
}