问题描述
在开始之前,只想说这是一个很长的条目。
表格视图以及按钮和文本字段一直存在问题。我要做的主要事情是创建一个待办事项列表,并将其放在单独的页面上。
使用户能够输入无任务并单击保存按钮,并能够向下滑动文本字段和saveButton的视图。返回到tableView的主页,并让输入的值更新或刷新到tableview。
问题是,截至目前,我必须重置应用程序以更新tableView。已经使用了reloadData()
和ViewDidAppear()
方法。但是由于某种原因,tableView不想更新。已经在控制台上输入了值打印,但是在按下保存按钮后,控制台在每次按下保存按钮后都会显示一个。因此,无论添加了多少项,应用程序始终处于落后状态,并且按下保存按钮后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;
}
}
解决方法
您有2个变量:listedCells
和listedCellss
。
保存时,您正在更新listedCellss和UserDefaults,但是listedCells仅在viewDidAppear
...
listedCells
变量,然后调用:
self.tableView?.reloadData();
编辑(观看视频后):
那里有2个View Controller:一个在其中按下“ Make Addition”(称为MainViewController),另一个在其上单击“ Save”(保存)按钮(称为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。