2017-05-12 13 views
0

CourseCellとBllCellという2つのプロトタイプセルを持つUITableViewがあります。これらのセルにはUISliderが含まれ、IBActionはメインのViewController上に配置されています。Swift:複数のセルクラスを使用する場合

スライダは、次のアクションがトリガーされた移動が完了した後:

@IBAction func sliderFinishedMoving(_ sender: Any) { 
    if let slider = sender as? gradeSlider { 
     if let superview = slider.superview { 

      if let cell = superview.superview as? CourseCell { 

       let selectedSemester = cell.activeSemester 

       let selectedIndexPath = courseTable.indexPath(for: cell)! 
       let selectedCourse = courseTypes[selectedIndexPath.section].courses[selectedIndexPath.row] 

       if selectedCourse.examType == "" && selectedCourse.examCourse == true { 
        print("please select the exam type before entering grades") 
        slider.value = 0.0 
        cell.gradeSliderLabel.frame.origin.x = slider.thumbCenterX - (cell.gradeSliderLabel.frame.width/2) 
        cell.gradeSliderLabel.text = "0" 
        return 
       } 

       print(selectedIndexPath.section, selectedIndexPath.row) 

       slider.value = round(slider.value) 
       cell.gradeSliderLabel.frame.origin.x = slider.thumbCenterX - (cell.gradeSliderLabel.frame.width/2) 

       switch(selectedSemester) { 
       case 1: 
        selectedCourse.semester1Grade = Int(slider.value) 
        break 
       case 2: 
        selectedCourse.semester2Grade = Int(slider.value) 
        break 
       case 3: 
        selectedCourse.semester3Grade = Int(slider.value) 
        break 
       case 4: 
        selectedCourse.semester4Grade = Int(slider.value) 
        break 
       case 5: 
        selectedCourse.examGrade = Int(slider.value) 
        break 
       case 6: 
        selectedCourse.oralGrade = Int(slider.value) 
        break 
       default: 
        break 
       } 

       courseTable.reloadData() 
      } 

      if let cell = superview.superview as? BllCell { 

       let selectedSemester = cell.activeSemester 

       let selectedIndexPath = courseTable.indexPath(for: cell)! 
       let selectedCourse = courseTypes[selectedIndexPath.section].courses[selectedIndexPath.row] 

       if selectedCourse.examType == "" && selectedCourse.examCourse == true { 
        print("please select the exam type before entering grades") 
        slider.value = 0.0 
        cell.gradeSliderLabel.frame.origin.x = slider.thumbCenterX - (cell.gradeSliderLabel.frame.width/2) 
        cell.gradeSliderLabel.text = "0" 
        return 
       } 

       print(selectedIndexPath.section, selectedIndexPath.row) 

       slider.value = round(slider.value) 
       cell.gradeSliderLabel.frame.origin.x = slider.thumbCenterX - (cell.gradeSliderLabel.frame.width/2) 

       switch(selectedSemester) { 
       case 1: 
        selectedCourse.semester1Grade = Int(slider.value) 
        break 
       case 2: 
        selectedCourse.semester2Grade = Int(slider.value) 
        break 
       case 3: 
        selectedCourse.semester3Grade = Int(slider.value) 
        break 
       case 4: 
        selectedCourse.semester4Grade = Int(slider.value) 
        break 
       case 5: 
        selectedCourse.examGrade = Int(slider.value) 
        break 
       case 6: 
        selectedCourse.oralGrade = Int(slider.value) 
        break 
       default: 
        break 
       } 

       courseTable.reloadData() 
      } 
     } 
    } 
} 

あなたが見ることができるように、重複したコードがあります。 FunctionCellとBllCellの両方でcell ... ...を呼び出すと、関数を複製することなく両方のcell.activeSemester変数にアクセスすることができますか?

+3

別に私たちと共有しているスパゲッティコードから、これは本当に、そのsubsubビューからセルを得るための最も恐ろしい方法です。ロジックを再設計し、[代理人](https://developer.apple.com/library/content/documentation/General/Conceptual/DevPedia-CocoaCore/Delegation.html)の使用を検討する必要があります。 – ozgur

+3

なぜ細胞を取得していますか?ビューではなく、データ・モデルにアクセスします。 – rmaddy

+1

... 2つの 'default'' break'sを除いて、他の 'break'文はすべて省略することができます。彼らはスウィフトでは必要ない。 – vadian

答えて

3

同じ命令を実行している場合は、両方の共通の親をBllCellCourseCellにする必要があります。

+2

これは有用かもしれないし有用でないかもしれない。本当の答えは、コード内のセルへのアクセスを避けることです。質問内のコードがどのセルにもアクセスしようとする必要はありません。 – rmaddy

+0

私はあなたがこれを理解することを願って:) –

0

あり、このコードで数多くの問題があるが、あなたの特定の質問にすぐに答えは、プロトコルを使用することです:

protocol GradeSliderCell: class { 
    var activeSemester: Int { get } 
    var gradeSliderLabel: UILabel! { get } 
} 

両方CourseCellBllCellは、このプロトコルに準拠する必要があります。半分に重複したコードをカット

@IBAction func sliderFinishedMoving(_ sender: Any) { 
    guard let slider = sender as? gradeSlider else { return } 
    guard let superview = slider.superview else { return } 

    if let cell = superview.superview as? GradeSliderCell { 

     let selectedSemester = cell.activeSemester 

     let selectedIndexPath = courseTable.indexPath(for: cell as! UITableViewCell)! 
     let selectedCourse = courseTypes[selectedIndexPath.section].courses[selectedIndexPath.row] 

     if selectedCourse.examType == "" && selectedCourse.examCourse == true { 
      print("please select the exam type before entering grades") 
      slider.value = 0.0 
      cell.gradeSliderLabel.frame.origin.x = slider.thumbCenterX - (cell.gradeSliderLabel.frame.width/2) 
      cell.gradeSliderLabel.text = "0" 
      return 
     } 

     print(selectedIndexPath.section, selectedIndexPath.row) 

     slider.value = round(slider.value) 
     cell.gradeSliderLabel.frame.origin.x = slider.thumbCenterX - (cell.gradeSliderLabel.frame.width/2) 

     switch(selectedSemester) { 
     case 1: 
      selectedCourse.semester1Grade = Int(slider.value) 
     case 2: 
      selectedCourse.semester2Grade = Int(slider.value) 
     case 3: 
      selectedCourse.semester3Grade = Int(slider.value) 
     case 4: 
      selectedCourse.semester4Grade = Int(slider.value) 
     case 5: 
      selectedCourse.examGrade = Int(slider.value) 
     case 6: 
      selectedCourse.oralGrade = Int(slider.value) 
     default: 
      break 
     } 

     courseTable.reloadData() 
    } 
} 
関連する問題