tableView.reloadData() не работает

Я делаю приложение для отслеживания своей домашней работы, и по какой-то причине, когда я вызываю reloadData, оно не работает, некоторые люди уже спрашивали об этом, но я пробовал там исправления, и они не работают для меня, вот файл, в который я добавляю новое домашнее задание:

import UIKit
class AddHomework : UIViewController {
     @IBOutlet weak var HomeworkNameLbl: UILabel!
     @IBOutlet weak var HomeworkNameTxt: UITextField!
     @IBOutlet weak var DueDateLbl: UILabel!
     @IBOutlet weak var DueDateTxt: UITextField!
     @IBOutlet weak var DueTimeLbl: UILabel!
     @IBOutlet weak var DueTimeTxt: UITextField!
     @IBOutlet weak var AddHomeworkBtn: UIButton!
     override func viewDidLoad() {
         super.viewDidLoad()
         self.hideKeyboardWhenTappedAround()
     }
     @IBAction func AddHomework(sender: UIButton) {
         let HomeworkName = HomeworkNameTxt.text
         let DueDate = DueDateTxt.text
         let DueTime = DueTimeTxt.text


         homeworkTableView().AddObject([DueDate!, DueTime!],    HomeworkName: HomeworkName!)


}
func hideKeyboardWhenTappedAround() {5
    let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(dismissKeyboard))
    view.addGestureRecognizer(tap)
}

func dismissKeyboard() {
    view.endEditing(true)
}


}

Вот файл, в котором у меня есть табличное представление:

     import UIKit
     class homeworkTableView: UIViewController, UITableViewDelegate,    UITableViewDataSource{
@IBOutlet weak var tableView: UITableView!
override func viewDidLoad() {
    super.viewDidLoad()
    self.tableView.reloadData()
}
var homework : [String: [String]] = [
    "Spanish Test": ["Aug 12", "12:00 AM", "Spanish"],
    "Math Sheet": ["Aug 13", "10:30 PM","Math"],
    "Code Thing": ["Aug 11","12:00 AM","Coding"]

]


var titles = [
    "Spanish Test", "Math Sheet", "Code Thing"
]

func AddObject(newArray: [String], HomeworkName: String){
    titles.append(HomeworkName)
    homework.updateValue(newArray, forKey: HomeworkName)

    print(homework)
    print(titles)
}


 func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return titles.count
}

 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let Cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! CustomCell

    Cell.Title.text = titles[indexPath.row]
    let currentTitle = titles[indexPath.row]
    let current = homework[currentTitle]!
    Cell.DueDate.text = "Due Date: \(current[0])"
    Cell.Class.text = "Due Time: \(current[1])"

    self.tableView.rowHeight = 100.00

    return Cell
}

}

И весь проект размещен на git здесь: https://github.com/IndyBob2019/HomeworkHelper

Любая помощь очень ценится, спасибо!


person David Richardson    schedule 16.08.2016    source источник
comment
Кажется, вы не загрузили проект с последними изменениями   -  person Dimuth Lasantha    schedule 16.08.2016
comment
взять reload() из ViewDiDLoad()   -  person Tho Nguyen    schedule 16.08.2016


Ответы (2)


Вам нужно делать то, что вы делаете в viewDidLoad в viewWillAppear. viewDidLoad вызывается только при запуске, поэтому, несмотря на изменение данных, ваше представление никогда не изменяет свои собственные локальные данные, поэтому, когда вы вызываете reloadData, оно по-прежнему использует старые данные.

Взято из tableView reloadData не работает.

person pkozlowski    schedule 16.08.2016

Вот несколько указателей, основанных на вашем коде,

Во-первых:
Вы просто звоните -reloadData() один раз в viewDidLoad()..

Во-вторых:
Если вы хотите увидеть внесенные изменения, они должны быть в следующем порядке: Update your -dataSource > -reloadData().

бывший. из твоего кода...

func AddObject(newArray: [String], HomeworkName: String){
    titles.append(HomeworkName)
    homework.updateValue(newArray, forKey: HomeworkName)

    // check is changes was made
    print(homework) 
    print(titles)  

    // reload after updating datasource
    self.tableView.reloadData() 
}

Редактировать: После проверки вашего проекта я должен сказать, что ваш подход отличается от того, что я имел в виду. Вызов вызова -reloadData() один раз в viewDidLoad() правильный, но проблема в вашей таблице dataSource, которая была обновлена ​​внутри File.swift от:

homeworkTableView().AddObject([DueDate!, DueTime!], HomeworkName: HomeworkName!)

Вы инициализировали класс homeworkTableView и добавили или добавили данные в этот класс, но при представлении homeworkTableView viewController из navigationController вы представляете новый класс homeworkTableView (а не homeworkTableView, который был обновлен).

Звонящий self.tableView.reloadData() говорит:

фатальная ошибка: неожиданно найдено nil при развертывании необязательного значения

потому что self.tableView было nil во время обновления,

Вот решение, которое я сделал:

Во-первых:
Глобализация источника данных для Cross class обновления, например:

import Foundation
import UIKit

// I just moved your variables outside the class
//
var homework : [String: [String]] = [
    "Spanish Test": ["Aug 12", "12:00 AM", "Spanish"],
    "Math Sheet": ["Aug 13", "10:30 PM","Math"],
    "Code Thing": ["Aug 11","12:00 AM","Coding"]

]

var titles = [
    "Spanish Test", "Math Sheet", "Code Thing"
]

class homeworkTableView: UIViewController, UITableViewDelegate, UITableViewDataSource{ 
    ...
    // codes
    ...
}

Во-вторых:
Удаление self.tableView.reloadData() внутри func AddObject(.., которое я предлагал ранее (не зная вашего подхода/реализации), например:

func AddObject(newArray: [String], HomeworkName: String){
    titles.append(HomeworkName)
    homework.updateValue(newArray, forKey: HomeworkName)

    // check is changes was made
    print(homework) 
    print(titles)
}
person 0yeoj    schedule 16.08.2016
comment
Я пробовал это, и это не сработало, я попробую еще раз, когда доберусь до своего компьютера. - person David Richardson; 16.08.2016
comment
Пишет фатальная ошибка: неожиданно найдено nil при распаковке необязательного значения - person David Richardson; 17.08.2016
comment
Я знаю, что обычно это означает, что одно из моих значений похоже на Optional(...), но я думал, что развернул все это с помощью !, я обновлю свой репозиторий git, если вы сможете взглянуть на это и оставить мне комментарий, который был бы великолепен - person David Richardson; 17.08.2016
comment
@ДэвидРичардсон; отличный! ваше репо. в git нет проекта. - person 0yeoj; 18.08.2016
comment
Странно, по какой-то причине все файлы в моем репозитории были удалены, я постараюсь исправить это завтра, но по какой-то причине у меня вообще возникли проблемы с загрузкой в ​​этот репозиторий, спасибо за терпение! - person David Richardson; 19.08.2016
comment
Я отмечаю вас, потому что я не уверен, что он автоматически уведомляет вас - person David Richardson; 20.08.2016
comment
@DavidRichardson, извините за поздний ответ, мой макбук сломался в данный момент. Проверьте обновленный ответ, надеюсь, он вам поможет. Ваше здоровье! :) - person 0yeoj; 22.08.2016
comment
Это отлично работает, чувак! Я вроде как отказался от этого проекта, потому что я просто не мог понять, насколько это простое решение. - person David Richardson; 12.09.2016