gpt4 book ai didi

ios - UITableViewController 中的按钮将数据发送到 detailViewController - swift

转载 作者:行者123 更新时间:2023-11-28 08:26:59 25 4
gpt4 key购买 nike

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

我需要它做的是,当你点击按钮“Button: enter image description here

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

使用设置为按钮文本的名称。应接收按钮名称的变量称为 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。您还必须创建一个直接从 UITableViewControllerdetailtableViewController 的 segue(所以不是从按钮或 View ,而是从一个 View Controller 到另一个)。您需要为这个 segue 提供一个标识符,因为我们将手动执行它。

在单元格中连接了 @IBAction 后,我们需要一种从单元格执行转场的方法。为此,我们需要引用 UITableViewController。我们可以使用委托(delegate)或响应器来获得它,最近我一直在使用响应器。

委托(delegate)

为您的 UITableViewController 创建一个要遵守的协议(protocol)。

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

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

weak var delegate: PostCellDelegate?

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

现在在您的 UITableViewController 中,您必须符合委托(delegate)并在 cellForRowAt 方法中设置单元格的委托(delegate)。

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

关于ios - UITableViewController 中的按钮将数据发送到 detailViewController - swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39704419/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com