【问题标题】:Getting a to do app to update or refresh, after clicking the save button单击保存按钮后,让待办事项应用程序更新或刷新
【发布时间】:2020-12-23 02:02:18
【问题描述】:

在开始之前只想说这是一个相当长的条目。

表格视图、按钮和文本字段一直存在问题。我要做的主要事情是创建一个待办事项列表并将其放在单独的页面上。

让用户能够输入无任务并单击保存按钮,并能够向下滑动文本字段和保存按钮的视图。回到tableView的主页面,将输入的值更新或刷新到tableview。

问题是,到目前为止,我必须重置应用程序才能更新 tableView。使用了reloadData()ViewDidAppear() 方法。但是 tableView 由于某种原因不想更新。已将值打印到控制台,但在按下保存按钮后,控制台在每次按下保存按钮后显示一个。所以无论添加多少item,app总是落后一个,按下save按钮后tableView也不会刷新。

在这个问题上困扰了大约一个月,正在寻求帮助。

以下是运行项目的 YouTube 视频链接: https://www.youtube.com/watch?v=G7cji9RUUpo&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;
   }
}

【问题讨论】:

    标签: swift uitableview button uibutton reloaddata


    【解决方案1】:

    您有 2 个变量:listedCellslistedCellss。 保存时,您正在更新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”中,覆盖prepare方法:

    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 覆盖在 MainViewController 上调用 reloadData。没有“全屏”viewWillAppear 不会被调用。

    【讨论】:

    • 更新了代码,去掉了listedCells,全部放到listedCells中。每次按下该应用程序都会在控制台中更新,但表格视图需要一个应用程序 reset.let savedToDo = UserDefaults.standard.object(forKey: "ThingAdded") if let savedUpdated = savedToDo as? [String] {listedCells = savedUpdatedlistedCells.append(textField.text!) print(listedCells) } else {listedCells = [textField.text!] } UserDefaults.standard.set(listedCells, forKey: "ThingAdded") self.tableView? .reloadData() }
    • 任何帮助仍然非常感谢!
    • 您是否也删除了var listedCellss: [String]; 行?您可以更新问题中的代码吗?每次您调用reloadData 时,它都会使用您的tableView(_ tableView: UITableView, cellForRowAt... 重新加载,因此只要您的实例的listedCells 更新,它应该可以工作
    • 嗯,是的,listedCells 已被删除,还更新了代码:/。感谢您抽出宝贵时间并为这么晚的回复道歉
    猜你喜欢
    • 1970-01-01
    • 2015-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-19
    • 1970-01-01
    • 2020-03-06
    • 2016-10-26
    相关资源
    最近更新 更多