Добрый день, добрый вечер!
Не могу до переть, как мне правильно обновить ячейку, суть загвоздки такая:
- При первой создании задачи, задача сохраняться в базу данных Realm, и обновления таблицы происходить мгновенно экран “Main”, при переходе на экран “Satistic” все очень классно, обновления произошло.
- При создании второй задачи, на первом экране тоже все хорошо, но при переходе на второй экран, таблица с новыми данными не обновляется
Вопрос: Подскажите, как можно реализовать перезагрузку таблицы, при добавлении новой задачи?
Код прилогается:
Первый экран:
private let localRealm = try! Realm()
private var workoutArray: Results<WorkoutModel>!
private var userArray: Results<UserModel>!
private let one = StatisticViewController()
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
getWorkouts(date: Date())
tableView.reloadData()
setupUserParameters()
}
override func viewDidLoad() {
super.viewDidLoad()
userArray = localRealm.objects(UserModel.self)
setupView(calendarView, addWorkoutButton,workoutTodayLabel, weatherView,tableView, noWorkoutImageView)
setupUserParameters()
setConstrains()
setDelegate()
}
private func setupUserParameters() {
if userArray.count != 0 {
calendarView.userNameLabel.text = userArray[0].userFirstName + userArray[0].userSecondName
guard let data = userArray[0].userImage else { return }
guard let image = UIImage(data: data) else { return }
calendarView.imagePerson.image = image
}
}
private func getWorkouts(date: Date) {
let dateTimeZone = date
let weekday = dateTimeZone.getWeekdayNumber()
let dateStart = dateTimeZone.startEndDate().0
let dateEnd = dateTimeZone.startEndDate().1
let predicateRepeat = NSPredicate(format: "workoutNumberOfDay = \(weekday) AND workoutRepeat = true")
let predicateUnrepeat = NSPredicate(format: "workoutRepeat = false AND workoutDate BETWEEN %@", [dateStart, dateEnd])
let compound = NSCompoundPredicate(type: .or, subpredicates: [predicateRepeat, predicateUnrepeat])
workoutArray = localRealm.objects(WorkoutModel.self).filter(compound).sorted(byKeyPath: "workoutName")
checkWorkoutsToday()
tableView.reloadData()
}
private func checkWorkoutsToday() {
if workoutArray.count == 0 {
tableView.isHidden = true
noWorkoutImageView.isHidden = false
} else {
tableView.isHidden = false
noWorkoutImageView.isHidden = true
tableView.reloadData()
}
}
@objc private func addWorkoutButtonTapped() {
let newWorkoutViewController = NewWorkoutViewController()
newWorkoutViewController.modalPresentationStyle = .fullScreen
present(newWorkoutViewController, animated: true)
}
}
Второй экран:
private let localRealm = try! Realm()
private var workoutArray: Results<WorkoutModel>!
private var differenceArray = [DifferenceWorkout]()
private var filtredArray = [DifferenceWorkout]()
private let dateToday = Date().localDate()
private var isFiltred = false
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
tableView.reloadData()
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
keyboardManagerVisible(false)
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
keyboardManagerVisible(true)
}
override func viewDidLoad() {
super.viewDidLoad()
setupView(statisticLabel, segmentedControl, nameTextField, exercisesLabel, tableView)
setConstraints()
setDelegate()
setStartScreen()
}
private func addTaps() {
let tapScreen = UITapGestureRecognizer(target: self, action: #selector(hideKeyboeard))
tapScreen.cancelsTouchesInView = false
view.addGestureRecognizer(tapScreen)
}
private func setDelegate() {
nameTextField.delegate = self
tableView.delegate = self
tableView.dataSource = self
tableView.register(StatisticTableViewCell.self, forCellReuseIdentifier: identifierCell)
}
private func getWorkoutsName() -> [String] {
var nameArray = [String]()
workoutArray = localRealm.objects(WorkoutModel.self)
for workoutModel in workoutArray {
if !nameArray.contains(workoutModel.workoutName) {
nameArray.append(workoutModel.workoutName)
}
}
return nameArray
}
private func getDifferenceModel(dateStart: Date) {
let dateEnd = Date().localDate()
let nameArray = getWorkoutsName()
for name in nameArray {
let predicateDifference = NSPredicate(format: "workoutName = '\(name)' AND workoutDate BETWEEN %@", [dateStart, dateEnd])
workoutArray = localRealm.objects(WorkoutModel.self).filter(predicateDifference).sorted(byKeyPath: "workoutDate")
guard let last = workoutArray.last?.workoutReps,
let first = workoutArray.first?.workoutReps else {
return
}
let differenceWorkout = DifferenceWorkout(name: name, lastReps: last, firstReps: first)
differenceArray.append(differenceWorkout)
}
}
private func setStartScreen() {
getDifferenceModel(dateStart: dateToday.offsetDays(days: 6))
}
private func filtringWorkouts(text: String) {
for workout in differenceArray {
if workout.name.lowercased().contains(text.lowercased()) {
filtredArray.append(workout)
}
}
}
@objc private func segmentChanged() {
if segmentedControl.selectedSegmentIndex == 0 {
differenceArray = [DifferenceWorkout]()
let dateStart = dateToday.offsetDays(days: 6)
getDifferenceModel(dateStart: dateStart)
tableView.reloadData()
} else {
differenceArray = [DifferenceWorkout]()
let dateStart = dateToday.offsetMonth(month: 1)
getDifferenceModel(dateStart: dateStart)
tableView.reloadData()
}
}
@objc private func hideKeyboeard() {
view.endEditing(true)
}
}