Получение приложения для выполнения для обновления после нажатия кнопки сохранения

#swift #uitableview #button #uibutton #reloaddata

#swift #uitableview #кнопка #uibutton #перезагрузка данных

Вопрос:

Перед началом просто хочу сказать, что это довольно длинная запись.

Возникли проблемы с табличными представлениями, кнопками и текстовыми полями. Главное, что я пытаюсь сделать, это создать список дел и разместить его на отдельной странице.

Пусть пользователь сможет ввести «нет задачи» и нажать кнопку «Сохранить», а также провести пальцем вниз по текстовому полю и кнопке «Сохранить». Возврат на главную страницу, которая является TableView, и обновление введенного значения в tableview.

Проблема в том, что на данный момент мне нужно перезагрузить приложение для обновления TableView. Использовали методы reloadData() и ViewDidAppear() . Но TableView по какой-то причине не хочет обновляться. Ввели значение, выводимое на консоль, но после нажатия кнопки сохранения консоль показывает по одному после каждого нажатия кнопки сохранения. Таким образом, независимо от того, сколько добавлено элементов, приложение всегда отстает, и просмотр таблицы не обновляется после нажатия кнопки «Сохранить».

Застрял в этой проблеме около месяца и ищу помощи.

Вот ссылка на видео с запущенным проектом на YouTube:https://www.youtube.com/watch?v=G7cji9RUUpoamp;feature=youtu.be

Вот код ниже:

 import UIKit

class ViewController: UIViewController, UITextFieldDelegate, UITableViewDelegate, UITableViewDataSource {
    
    lazy var refreshData: UIRefreshControl = {
        let dataRefresh = UIRefreshControl();
        dataRefresh.addTarget(self, action: #selector(dataRequest), for: .valueChanged)
        self.tableView?.reloadData();
        return dataRefresh;   
    }()
    

    var listedCells: [String] = []
   
    internal func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        
       return listedCells.count
   
    }
    
    internal func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
      
       let cells = UITableViewCell(style: UITableViewCell.CellStyle.default, reuseIdentifier: "TDList")
        
        cells.textLabel?.text = listedCells[indexPath.row
        
        return cells  
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
}
    
    @objc
    func dataRequest() {
        let endRefresh = DispatchTime.now()   .milliseconds(400);
        DispatchQueue.main.asyncAfter(deadline: endRefresh) {
            self.refreshData.endRefreshing();
        }
        self.tableView?.reloadData();
        
        refreshData.endRefreshing();
       
        self.tableView?.reloadData();
        
    }

        override func viewDidAppear(_ animated: Bool) {
          
            if #available(iOS 10.0, *) {
                tableView?.refreshControl = refreshData;
            } else {
                tableView?.addSubview(refreshData);
            }
              
            textField?.clearButtonMode = .always;
            textField?.clearButtonMode = .whileEditing;
            
            tableView?.delegate = self;
            tableView?.dataSource = self;
            
            let savedToDo = UserDefaults.standard.object(forKey: "ThingAdded")
            
            if let savedToList = savedToDo as? [String] {
                
                listedCells = savedToList;      
        }   
            self.tableView?.reloadData();
        
}
            
     func tableView(_ tableView: UITableView, commit deleteSlider: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
        
        if deleteSlider == UITableViewCell.EditingStyle.delete {
            
            listedCells.remove(at: indexPath.row)
        
            self.tableView?.reloadData();
                   
            UserDefaults.standard.set(listedCells, forKey: "ThingAdded")
            
        }            
    }
    
    @IBOutlet weak var tableView: UITableView!
    
    @IBOutlet weak var textField: UITextField!
    
    @IBAction func saveButton(_ sender: Any?) {
       
        let savedToDo = UserDefaults.standard.object(forKey: "ThingAdded")
        
        if let savedUpdated = savedToDo as? [String] {
            
            listedCells = savedUpdated;
            
            listedCells.append(textField.text!);
            
            print(listedCells);
            
        } else {
           
            listedCells = [textField.text!];
        }
        
        UserDefaults.standard.set(listedCells, forKey: "ThingAdded");
       
// right handed and left handed mode
     override   func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        self.view.endEditing(true);
    }  

   public     func textFieldShouldReturn(_ textField: UITextField) -> Bool {
            textField.resignFirstResponder()
            
            return true;
   }
}

  

Ответ №1:

У вас есть 2 переменные: listedCells и listedCellss . При сохранении вы обновляете listedCellss и UserDefaults, но listedCells обновляется только в viewDidAppear

в функции SaveButton в конце просто обновите свою listedCells переменную, а затем вызовите:

 self.tableView?.reloadData();
  

РЕДАКТИРОВАТЬ (после просмотра вашего видео):

У вас есть 2 контроллера просмотра: один, где вы нажимаете «Добавить» (назовем его MainViewController), а другой — с кнопкой «Сохранить» (назовем его AdditionViewController). Таблица, которую вы хотите обновить, принадлежит MainViewController, поэтому, когда вы нажимаете «Сохранить», вам действительно нужно, чтобы MainViewController вызывал reloadData. Вы можете добиться этого с помощью обратного вызова:

В «AdditionViewController» определите:

 typealias ItemAddedCallback = () -> Void
var itemReadyCallback: ItemAddedCallback?

@IBAction func saveButton(_ sender: Any?) {
    ...
    itemReadyCallback?()
}
  

В «MainViewController» переопределите метод подготовки:

 override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    // Get the new view controller using segue.destination.
    if let avc = segue.destination as? AdditionViewController {
        avc.itemReadyCallback = {
            self.tableView?.reloadData()
    }
}
  

или:
Вы можете определить режим представления segue как «Полноэкранный», а затем вы можете использовать viewWillAppear переопределение для вызова reloadData в MainViewController. Без «полноэкранного» viewWillAppear не вызывается.

Комментарии:

1. обновил код и избавился от listedCellss и поместил все в listedCells. Приложение обновляется в консоли при каждом нажатии, но для просмотра таблицы требуется сброс приложения. пусть savedToDo = UserDefaults.standard.object(forKey: «ThingAdded»), если пусть savedUpdated = savedToDo как? [Строка] { Список ячеек = сохраненный обновленный список ячеек.добавить(текстовое поле.текст!) печать(список ячеек) } else {Список ячеек = [тексТовое поле.текст!] } UserDefaults.standard.set(список ячеек, forKey: «ThingAdded») self.TableView? .reloadData() }

2. любая помощь по-прежнему серьезно ценится!

3. вы тоже удалили var listedCellss: [String]; строку? можете ли вы обновить свой код в вопросе? Каждый раз, когда вы вызываете, reloadData он будет использовать ваш tableView(_ tableView: UITableView, cellForRowAt... для перезагрузки, поэтому, пока listedCells вашего экземпляра обновляется, он должен работать

4. Да, список ячеек был удален, также обновлен код :/. Спасибо за ваше время и приносим извинения за такой поздний ответ