protocol ClassFeedbackCellDelegate {
func sharePressed(cell: FeedbackCell)
}
class FeedbackCell: UITableViewCell {
var delegate: ClassFeedbackCellDelegate?
@IBOutlet weak var cosmosViewBelongingToFeedBackCell: CosmosView!
@IBOutlet weak var submitButtonOutlet: UIButton!
@IBAction func submitFeedBack(_ sender: Any) {
delegate?.sharePressed(cell: self)
}
}
class DetailViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "ContentCell")
let feedbackCell = tableView.dequeueReusableCell(withIdentifier: "FeedbackCell") as? FeedbackCell
feedbackCell?.delegate = self //assign self as the delegate
if bookingCompleted && indexPath.section == 0 {
//default rating when tableView loads for first time
feedbackCell?.cosmosViewBelongingToFeedBackCell.rating = 4
return feedbackCell ?? UITableViewCell()
}
(cell?.contentView.viewWithTag(1) as? UILabel)?.text = titles[indexPath.row]
(cell?.contentView.viewWithTag(2) as? UILabel)?.text = titlesToValues[titles[indexPath.row]]
return cell ?? UITableViewCell()
}
}
extension DetailViewController: ClassFeedbackCellDelegate {
func sharePressed(cell: FeedbackCell) {
print("sharePressed was called ")// prints out
cell.cosmosViewBelongingToFeedBackCell.didFinishTouchingCosmos = {
rating in
print("rating here in extension is \(rating)")//doesn't print out
}
}
}
:
//ユーザーがビューから指を離すことにより、格付けを変更完了したときに呼び出されます。 sharePressed(cell: FeedbackCell)
が呼び出されたときに cosmosView.didFinishTouchingCosmos = {での評価は}
だから、ユーザーが既にので、これはあなたのニーズに合わせていない指を持ち上げたしています。
代わりに、あなたはおそらくこれを行うことができます。また
func sharePressed(cell: FeedbackCell) {
print("sharePressed was called ")// prints out
print("rating: \(cell.cosmosViewBelongingToFeedBackCell.rating)")
}
をユーザーがスクロールテーブルビューば評価はリセットされるように、どこかの評価を保存する必要があります。
編集:あなたは、現在の格付けを追跡したい場合は
、あなたはプロトコルを変更し、FeedbackCell
にリスナーを追加することができます:DetailViewController
で次に
protocol ClassFeedbackCellDelegate {
func sharePressed(cell: FeedbackCell)
func ratingDidChange(rating: Float)
}
class FeedbackCell: UITableViewCell {
var delegate: ClassFeedbackCellDelegate?
@IBOutlet weak var cosmosViewBelongingToFeedBackCell: CosmosView!
@IBOutlet weak var submitButtonOutlet: UIButton!
@IBAction func submitFeedBack(_ sender: Any) {
delegate?.sharePressed(cell: self)
}
override func awakeFromNib() {
super.awakeFromNib()
cosmosViewBelongingToFeedBackCell.didFinishTouchingCosmos = {
rating in
self.delegate?.ratingDidChange(rating)
}
}
}
:
extension DetailViewController: ClassFeedbackCellDelegate {
func ratingDidChange(rating: Float) {
print(rating)
}
}
'IBAction func submitFeedBack'は' FeedbackCell'か 'DetailViewController'にありますか?ネイティブのUIPickerViewと同じ動作を作成したいと思います。例えば、ユーザがcosmosViewから指を離したとき、 'DetailViewController'の中で星の評価を受け取ることができます。基本的には 'FeedbackCell'の' DetailViewController'への参照を取得する必要があります。 'cosmosView.didFinishTouchingCosmos = {rating in //ここで値を使用}'ありがとうございました – bibscy
@bibscy編集された答え。 – chengsam
それは魅力のように動作します。ありがとう – bibscy