TableView addSubview refreshData Problem

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

HEUTE endet der Call for Papers & Workshops für die Macoun 2019! Einreichungen sind noch bis heute Abend möglich: https://macoun.de/callforpapers.

  • TableView addSubview refreshData Problem

    Hallo,

    ich habe auf meiner App einen refresher eingebaut und jetzt das Problem das jedes mal wenn ich die Seite refreshen will, ich in meiner cellForRowAt Funktion für folgende Zeile die Fehlermeldung "Index out of Range" bekomme. Ich glaube auch zu wissen was das Problem ist und zwar füge ich meiner ScrollView über addSubview Bilder hinzu. Lade ich die Seite nun neu, werden der aktuellen View erneut Bilder hinzugefügt...

    Zwar glaube ich zu wissen was das Problem ist, jedoch weiß ich nicht so recht wie ich es am besten beheben kann. Das Problem ist halt wie gesagt addSubview doch weiß einer von euch eventuell was man machen kann damit der aktuellen View die neuen Bilder nicht noch on Top hinzugefügt werden, diese einfach neu geladen wird ?


    Quellcode

    1. let userData = items.data[indexPath.row]



    Aber hier nochmal der Code, habe ihn mehr auf das relevant Zeug gekürzt:



    Quellcode

    1. func setQuestionData() {
    2. var request = URLRequest(url: baseURL)
    3. request.setValue(login_session, forHTTPHeaderField: "Authorization")
    4. request.httpMethod = "GET"
    5. let task = URLSession.shared.dataTask(with: request as URLRequest) { (data, response, error) in
    6. guard let data = data else { return }
    7. let decoder = JSONDecoder()
    8. self.items = (try? decoder.decode(RootElement.self, from: data)) ?? RootElement()
    9. self.savedUsers.append(contentsOf: self.items.data)
    10. DispatchQueue.main.async {
    11. self.demoTableView.reloadData()
    12. }
    13. }
    14. task.resume()
    15. }
    Alles anzeigen

    Quellcode

    1. @objc func refreshData() {
    2. setQuestionData()
    3. refresher.endRefreshing()
    4. }

    Quellcode

    1. else {
    2. guard let cell = tableView.dequeueReusableCell(withIdentifier: "QuestionLine", for: indexPath) as? HomeTableViewCell else { fatalError()}
    3. let userData = items.data[indexPath.row]
    4. let questionData = userData.userQuestions //Muss getestet werden
    5. demoTableView.rowHeight = 335
    6. for (questionIndex, data) in zip(0..<userData.userQuestions.count, questionData) {
    7. let questionImageView: UIImageView = UIImageView(image:nil)
    8. let index = questionIndex
    9. for picture in data.questionImages {
    10. let imageToDisplay: URL? = URL(string: allQuestionPictureURL + picture)
    11. if let imageUrl = imageToDisplay {
    12. questionImageView.sd_setImage(with: imageUrl)
    13. }
    14. questionImageView.contentMode = .scaleAspectFill
    15. let xPosition = 230 * CGFloat(index)
    16. questionImageView.layer.cornerRadius = 10
    17. questionImageView.layer.borderWidth = 1
    18. questionImageView.layer.borderColor = UIColor.lightGray.cgColor
    19. questionImageView.layer.masksToBounds = true
    20. questionImageView.frame = CGRect(x: xPosition + 20, y: CGFloat(0), width: setWidthForScrollView, height: cell.homeScrollView.frame.size.height)
    21. cell.homeScrollView.contentSize.width = 240 * CGFloat(index + 1)
    22. }
    23. cell.homeScrollView.addSubview(questionImageView)
    24. }
    25. tableView.tableFooterView = UIView(frame: CGRect.zero)
    26. return cell
    27. }
    Alles anzeigen
  • Mac & i Test Abo
  • Du könntest bei den ImageViews in dem ScrollView den tag Wert setzen, z.B. auf 4711 + index. Dann könntest Du die ImageViews wiederverwenden und musst nicht immer neue erzeugen. Über viewWithTag(_:) kannst Du Dir dann den entsprechenden ImageView des ScrollView geben lassen. Gibt es noch keinen, dann erzeugst Du einen und fügst ihn mit dem passenden tag zum ScrollView hinzu.
  • Ich habe leider noch nie mit viewWithTag gearbeitet aber wollte das ganze dann natürlich ausprobieren doch leider will das ganze noch nicht richtig klappen, was mache ich falsch ?

    Also ich habe es jetzt mal so gemacht:

    Quellcode

    1. if let theQuestion = self.view.viewWithTag(questionImageView.tag) as? UIImageView {
    2. print(theQuestion)
    3. } else {
    4. questionImageView.addSubview(overlay)
    5. questionImageView.addSubview(questionLabel)
    6. cell.homeScrollView.addSubview(questionImageView)
    7. }


    Hier nochmal der gesamte Code:

    Quellcode

    1. for (questionIndex, data) in zip(0..<userData.userQuestions.count, questionData) {
    2. let questionImageView: UIImageView = UIImageView(image:nil)
    3. let index = questionIndex
    4. questionImageView.tag = index
    5. //Code zu Erstellung der Maske
    6. let overlay: UIView = UIView(frame: CGRect(x: 0, y: 200, width: cell.homeScrollView.frame.size.width/2 + 20, height: cell.homeScrollView.frame.size.height/4))
    7. overlay.backgroundColor = UIColor.black.withAlphaComponent(0.3)
    8. let questionLabel = UILabel(frame: CGRect(x: 0, y: 0, width: cell.homeScrollView.frame.size.width/2 , height: cell.homeScrollView.frame.size.height/4))
    9. questionLabel.text = data.questionTitle
    10. questionLabel.textColor = .white
    11. questionLabel.font = UIFont.boldSystemFont(ofSize: 14.0)
    12. questionLabel.center = overlay.center
    13. if let theQuestion = self.view.viewWithTag(questionImageView.tag) as? UIImageView {
    14. print(theQuestion)
    15. } else {
    16. questionImageView.addSubview(overlay)
    17. questionImageView.addSubview(questionLabel)
    18. cell.homeScrollView.addSubview(questionImageView)
    19. }
    20. }
    21. tableView.tableFooterView = UIView(frame: CGRect.zero)
    22. return cell
    23. }
    Alles anzeigen