Lassen Ich habe eine UITableView mit 2 Prototyp-Zellen: CourseCell und BllCell. Diese Zellen enthalten einen UISlider und eine IBAction befindet sich auf dem Haupt-ViewController.Swift: Wenn mit mehreren Zellen Klassen
Nachdem der Schieber abgeschlossen hat, wird die folgende Aktion zu bewegen ausgelöst:
@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()
}
}
}
}
Wie Sie sehen können, gibt doppelten Code ist. Ist es möglich zu feuern, wenn Zelle ... sowohl mit CourseCell als auch mit BlllCell verbunden ist, um auf die Variable cell.activeSemester in beiden zuzugreifen, ohne die Funktion duplizieren zu müssen?
Neben dem Spaghetti-Code Sie mit uns geteilt haben, das ist wirklich die schrecklichste Art und Weise Zelle von ihrer subsub Ansicht zu bekommen. Sie sollten Ihre Logik neu gestalten und die Verwendung von [Delegaten] in Erwägung ziehen (https://developer.apple.com/library/content/documentation/General/Conceptual/DevPedia-CocoaCore/Delegation.html). – ozgur
Warum bekommen Sie die Zelle? Greifen Sie auf Ihr Datenmodell zu, nicht auf die Ansicht. – rmaddy
... und mit Ausnahme der beiden "default" -Brüche können Sie alle anderen 'break'-Anweisungen auslassen. Sie werden nicht in Swift benötigt. – vadian