2017-11-29 28 views
0

2つのセクションを持つUITableViewでは、CosmosView star ratingを実装したいと思います。最初のセクションで
私はプロトタイプのセルを作成し、その後、私はタップされたセルとDetailViewControllerを提供しなければならないprotocol ClassFeedbackCellDelegateを実装するカスタムクラスFeedbackCellデリゲートを使用してCosmosの星評価を実装するにはどうすればよいですか?

に割り当てます。
問題点は、評価値がDetailViewControllerで、func sharePressed(cell: FeedbackCell)になっていないことです。私はこの答えに基づいてプロトコルを実装しました。 how to call presentViewController from within a UICollectionViewCell
この評価管理を正しく実装する方法を教えてください。文書によると

enter image description here

答えて

1

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) 
    } 
} 
+0

'IBAction func submitFeedBack'は' FeedbackCell'か 'DetailViewController'にありますか?ネイティブのUIPickerViewと同じ動作を作成したいと思います。例えば、ユーザがcosmosViewから指を離したとき、 'DetailViewController'の中で星の評価を受け取ることができます。基本的には 'FeedbackCell'の' DetailViewController'への参照を取得する必要があります。 'cosmosView.didFinishTouchingCosmos = {rating in //ここで値を使用}'ありがとうございました – bibscy

+0

@bibscy編集された答え。 – chengsam

+0

それは魅力のように動作します。ありがとう – bibscy

関連する問題