英文:
Failed to reload and display data in tableview
问题
以下是您提供的代码的中文翻译:
首先,我是Swift和iOS开发的初学者。这是我的第一个应用程序,我在学习Swift和iOS的基础知识后开始开发的。
在使用Realm添加新数据后,重新加载tableview
中的数据正常工作。不幸的是,在更新或删除后,重新加载tableview
中的数据不起作用。在更新或删除后显示以前的数据。请帮忙。
代码或应用程序的工作原理:
- 主页HomeViewController包含一个空的表视图中的数据列表和一个名为ADD的按钮。
- 按下ADD -> 跳转到添加页面,其中包含标题和注释字段 -> 按下DONE -> 返回主页,重新加载并显示数据中的标题。(这部分正常工作)
- 使用
didSelectRowAt
跳转到DisplayDataViewController,仅查看数据中的标题和注释。此页面包含EDIT和DELETE按钮。 - 按下EDIT -> 跳转到编辑页面即AddNotesViewController(使用相同的页面进行添加和编辑,这就是我使用flagAdd/flagEdit变量的原因) -> 更新后返回主页,并且应该重新加载和显示(重新加载在此处失败,
tableview
中没有更改)。 - 按下DELETE -> 返回主页,不幸的是,此处也无法重新加载。
而且,CRUD与数据库正常工作。
数据
import Foundation
import RealmSwift
@objcMembers class Data: Object {
dynamic var title = ""
dynamic var notes = ""
}
HomeViewController:
import UIKit
import RealmSwift
class HomeViewController: UIViewController, RefreshDelegate {
@IBOutlet var tableViewField: UITableView!
let realm = try! Realm()
var taskView: Results<Data>?
override func viewDidLoad() {
super.viewDidLoad()
tableViewField.delegate = self
tableViewField.dataSource = self
loadData()
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
let addVc = segue.destination as! AddNotesViewController
addVc.flagAdd = 0
addVc.delegate = self
}
func loadData() {
taskView = realm.objects(Data.self)
tableViewField.reloadData()
}
}
extension HomeViewController: UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return taskView?.count ?? 1
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
cell.textLabel?.text = taskView?[indexPath.row].title ?? "Empty List"
return cell
}
}
extension HomeViewController: UITableViewDelegate {
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true)
let displayVc = storyboard?.instantiateViewController(identifier: "displayData") as! DisplayDataViewController
displayVc.index1 = indexPath.row
displayVc.viewDetails = taskView![indexPath.row]
navigationController?.pushViewController(displayVc, animated: true)
}
}
AddNotesViewController:
import UIKit
import RealmSwift
protocol RefreshDelegate {
func loadData()
}
class AddNotesViewController: UIViewController {
@IBOutlet var titleTextField: UITextField!
@IBOutlet var notesTextView: UITextView!
let realm = try! Realm()
var delegate: RefreshDelegate?
var EditView: Data?
var index2: Int?
var flagAdd: Int?
var flagEdit: Int?
override func viewDidLoad() {
super.viewDidLoad()
}
override func viewWillAppear(_ animated: Bool) {
if flagEdit == 1 {
navigationItem.title = "Edit Page"
if let myEdit = self.EditView {
titleTextField.text = myEdit.title
notesTextView.text = myEdit.notes
}
}
}
@IBAction func doneButtonPressed(_ sender: UIBarButtonItem) {
let note = notesTextView.text
if titleTextField.text == ""
{
titleTextField.placeholder = "Write Something.."
}
else if note == "" || note == "Write notes here...." || note == "Sorry! Write Something here."
{
notesTextView.text = "Sorry! Write Something here."
}
else if flagAdd == 0
{
let titleText = titleTextField.text
let notesField = notesTextView.text
let dataRealm = Data()
dataRealm.title = titleText!
dataRealm.notes = notesField!
try! realm.write{
realm.add(dataRealm)
}
delegate?.loadData()
titleTextField.endEditing(true)
notesTextView.endEditing(true)
navigationController?.popViewController(animated: true)
}
else
{
let newData = realm.objects(Data.self)[index2!]
try! realm.write {
newData.title = titleTextField.text!
newData.notes = notesTextView.text
}
delegate?.loadData()
titleTextField.endEditing(true)
notesTextView.endEditing(true)
navigationController?.popToRootViewController(animated: true)
}
}
}
相同的添加页面用作编辑页面。这就是我使用flagAdd/flagEdit变量的原因。
DisplayDataViewController:
import UIKit
import RealmSwift
class DisplayDataViewController: UIViewController {
@IBOutlet var DisplayTitleField: UITextField!
@IBOutlet var DisplayNotesField: UITextView!
let realm = try! Realm()
var index1: Int?
var viewDetails: Data?
var delegate: RefreshDelegate?
override func viewDidLoad() {
super.viewDidLoad()
}
override func viewWillAppear(_ animated: Bool) {
if let myView = self.viewDetails {
DisplayTitleField.text = myView.title
DisplayNotesField.text = myView.notes
}
}
@IBAction func EditButtonPressed(_ sender: UIButton) {
let editVc = storyboard?.instantiateViewController(identifier: "goToAdd") as! AddNotesViewController
editVc.index2 = index1
editVc.EditView = viewDetails
editVc.flagEdit = 1
navigationController?.pushViewController(editVc, animated: true)
}
@IBAction func deleteButtonPressed(_ sender: UIBarButtonItem) {
try! realm.write {
realm.delete(viewDetails!)
}
delegate?.loadData()
navigationController?.popViewController(animated: true)
}
}
希望这有助于您理解代码的中文翻译。如果您有任何进一步的问题或
英文:
Firstly, I'm a beginner in Swift and iOS development. This is my first app, which I am working on after learning the basics of Swift and iOS.
Reloading the data in the tableview
after adding new data is working properly using Realm. Unfortunately, after an update or deletion, reloading the data in the tableview
does not work. Showing the previous data in table view after an update or deletion. Please help.
How the code works or app works:
- Home page HomeViewController contains an empty list of data in table view and a button called ADD.
- ADD pressed --> jump to add page, having field for title and notes --> DONE pressed --> return to home, reload and display the title in the Data.(This is working)
- Using
didSelectRowAt
it jumps to the DisplayDataViewController, just to view the title and notes in the Data. This page contains EDIT and DELETE button. - EDIT pressed --> jump to edit page ie AddNotesViewController (same page is used for add and edit, that's why I used flagAdd/flagEdit variables) --> after update it goes to home page, and it should be reloaded and display (reloading fails here, no changes in
tableview
). - DELETE pressed --> goes home, unfortunately reloading fails here also.
And the thing is, CRUD is working properly with the database.
Data
import Foundation
import RealmSwift
@objcMembers class Data: Object {
dynamic var title = ""
dynamic var notes = ""
}
HomeViewController:
import UIKit
import RealmSwift
class HomeViewController: UIViewController, RefreshDelegate {
@IBOutlet var tableViewField: UITableView!
let realm = try! Realm()
var taskView: Results<Data>?
override func viewDidLoad() {
super.viewDidLoad()
tableViewField.delegate = self
tableViewField.dataSource = self
loadData()
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
let addVc = segue.destination as! AddNotesViewController
addVc.flagAdd = 0
addVc.delegate = self
}
func loadData() {
taskView = realm.objects(Data.self)
tableViewField.reloadData()
}
}
extension HomeViewController: UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return taskView?.count ?? 1
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
cell.textLabel?.text = taskView?[indexPath.row].title ?? "Empty List"
return cell
}
}
extension HomeViewController: UITableViewDelegate {
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true)
let displayVc = storyboard?.instantiateViewController(identifier: "displayData") as! DisplayDataViewController
displayVc.index1 = indexPath.row
displayVc.viewDetails = taskView![indexPath.row]
navigationController?.pushViewController(displayVc, animated: true)
}
}
AddNotesViewController:
import UIKit
import RealmSwift
protocol RefreshDelegate {
func loadData()
}
class AddNotesViewController: UIViewController {
@IBOutlet var titleTextField: UITextField!
@IBOutlet var notesTextView: UITextView!
let realm = try! Realm()
var delegate: RefreshDelegate?
var EditView : Data?
var index2: Int?
var flagAdd: Int?
var flagEdit: Int?
override func viewDidLoad() {
super.viewDidLoad()
}
override func viewWillAppear(_ animated: Bool) {
if flagEdit == 1 {
navigationItem.title = "Edit Page"
if let myEdit = self.EditView {
titleTextField.text = myEdit.title
notesTextView.text = myEdit.notes
}
}
}
@IBAction func doneButtonPressed(_ sender: UIBarButtonItem) {
let note = notesTextView.text
if titleTextField.text == ""
{
titleTextField.placeholder = "Write Something.."
}
else if note == "" || note == "Write notes here...." || note == "Sorry! Write Something here."
{
notesTextView.text = "Sorry! Write Something here."
}
else if flagAdd == 0
{
let titleText = titleTextField.text
let notesField = notesTextView.text
let dataRealm = Data()
dataRealm.title = titleText!
dataRealm.notes = notesField!
try! realm.write{
realm.add(dataRealm)
}
delegate?.loadData()
titleTextField.endEditing(true)
notesTextView.endEditing(true)
navigationController?.popViewController(animated: true)
}
else
{
let newData = realm.objects(Data.self)[index2!]
try! realm.write {
newData.title = titleTextField.text!
newData.notes = notesTextView.text
}
delegate?.loadData()
titleTextField.endEditing(true)
notesTextView.endEditing(true)
navigationController?.popToRootViewController(animated: true)
}
}
}
The same add page is used as an edit page. That's why I used the flagAdd/flagEdit variable.
DisplayDataViewController:
import UIKit
import RealmSwift
class DisplayDataViewController: UIViewController {
@IBOutlet var DisplayTitleField: UITextField!
@IBOutlet var DisplayNotesField: UITextView!
let realm = try! Realm()
var index1 : Int?
var viewDetails : Data?
var delegate : RefreshDelegate?
override func viewDidLoad() {
super.viewDidLoad()
}
override func viewWillAppear(_ animated: Bool) {
if let myView = self.viewDetails {
DisplayTitleField.text = myView.title
DisplayNotesField.text = myView.notes
}
}
@IBAction func EditButtonPressed(_ sender: UIButton) {
let editVc = storyboard?.instantiateViewController(identifier: "goToAdd") as! AddNotesViewController
editVc.index2 = index1
editVc.EditView = viewDetails
editVc.flagEdit = 1
navigationController?.pushViewController(editVc, animated: true)
}
@IBAction func deleteButtonPressed(_ sender: UIBarButtonItem) {
try! realm.write {
realm.delete(viewDetails!)
}
delegate?.loadData()
navigationController?.popViewController(animated: true)
}
}
答案1
得分: 1
Here is the translated content:
HomeViewController,
我所做的只是在 didSelectRowAt
中添加了一行代码。以下是更新后的 didSelectRowAt
代码:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true)
let dv = (storyboard?.instantiateViewController(identifier: "displayData"))! as! DisplayDataViewController
dv.index1 = indexPath.row
dv.viewDetails = taskView![indexPath.row]
dv.delegate = self // 新添加的代码。它解决了一个删除问题。
navigationController?.pushViewController(dv, animated: true)
}
DisplayDataViewController,在这里我也添加了 ev.delegate = delegate
。以下是更新的 EditButtonPressed
代码:
@IBAction func EditButtonPressed(_ sender: UIButton) {
let ev = storyboard?.instantiateViewController(identifier: "goToAdd") as! AddNotesViewController
ev.EditView = viewDetails
ev.index2 = index1!
ev.flagEdit = 1
ev.delegate = delegate // 新添加的代码。它解决了一个更新问题。
navigationController?.pushViewController(ev, animated: true)
}
最后,它已经可以工作了。
英文:
HomeViewController,
What I did is just add one line of code in didSelectRowAt
. Here is the updated didSelectRowAt
:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true)
let dv = (storyboard?.instantiateViewController(identifier: "displayData"))! as! DisplayDataViewController
dv.index1 = indexPath.row
dv.viewDetails = taskView![indexPath.row]
dv.delegate = self // Newly added code.It solves a problem for deletion.
navigationController?.pushViewController(dv, animated: true)
}
DisplayDataViewController , Here also I added ev.delegate = delegate
. Here is the updated code for EditButtonPressed
@IBAction func EditButtonPressed(_ sender: UIButton) {
let ev = storyboard?.instantiateViewController(identifier: "goToAdd") as! AddNotesViewController
ev.EditView = viewDetails
ev.index2 = index1!
ev.flagEdit = 1
ev.delegate = delegate // Newly added code.It solves a problem for updating.
navigationController?.pushViewController(ev, animated: true)
}
Finally it's working.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论