2017-11-29 1 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' 안에 별 등급을받을 수 있습니다. 기본적으로 나는 CosmosView에서'FeedbackCell'에있는 'DetailViewController'에 대한 참조를 얻을 필요가 있습니다. 그래서'cosmosView.didFinishTouchingCosmos = {rating in // 여기서 값을 사용하십시오}'할 수 있습니다. 감사합니다. – bibscy

+0

@bibscy See my 편집 된 답변. – chengsam

+0

그것은 매력처럼 작동합니다. 덕분에 – bibscy

관련 문제