簡體   English   中英

來自UITableViewController的按鈕將數據發送到detailViewController - swift

[英]Button from UITableViewController sends data to detailViewController - swift

我有一個問題,我不能包圍我的頭..你不能在UITableViewController中創建一個按鈕動作..所以我試圖控制+從按鈕拖動到detailtableViewController並按下推..但當我使用prepareForSegue和我然后單擊按鈕,它應該將按鈕文本發送到detailtableViewController中的字符串,但有時它不是正確的名稱,因為tableView中有多個單元格,名稱並不總是相同。

我需要它做的是,當你點擊按鈕“按鈕: 在此輸入圖像描述

它應該轉到這個detailtableViewController: 在此輸入圖像描述

將名稱設置為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)
            }



        }

    }









}

假設您已經為包含Button的單元格創建了自定義類,則必須為didTouchUpInside事件創建一個@IBAction 您還必須直接從UITableViewController創建一個segue到detailtableViewController (因此不能從按鈕或視圖,從一個視圖控制器到另一個視圖控制器)。 您將需要為此segue提供一個標識符,因為我們將手動執行它。

一旦你在單元格中連接了@IBAction ,我們就需要一種從單元格中執行segue的方法。 為此,我們需要對UITableViewController的引用。 我們可以使用代表或響應者來獲取它,最近我一直在使用響應者。

代表

為您的UITableViewController創建一個符合的協議。

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

在自定義單元類中創建一個委托變量,從該按鈕的@IBAction為該事件調用didTouchUpInside方法。

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
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM