gpt4 book ai didi

ios - 如何让新项目显示在 ListView 中

转载 作者:行者123 更新时间:2023-11-28 14:36:26 25 4
gpt4 key购买 nike

我正在 Xcode 9.4 中构建一个应用程序,在另一个 View Controller 中创建新项目后,我无法在 ListView 中显示它。该项目显示在 CoreData 中,但为了让项目显示在 ListView 中,我必须退出 ListView ,然后返回以在列表中查看它。

我已经添加了 Protocol 和 Delegate 方法,但公式中仍然缺少一些东西。

这是添加新项目的 DetailViewController 中的代码:

import UIKit
import CoreData


protocol DetailViewControllerDelegate: class {
func detailViewController(_ controller: DetailViewController, didFinishAdding task: Task)
// func detailViewController(_ controller: DetailViewController, didFinishEditing task: Task)
}

class DetailViewController: UIViewController, UITextFieldDelegate, UITextViewDelegate {

var tasks = [Task]()

let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext

var selectedTask: String?
var taskDetails: String?
var taskCategory: Category?

@IBOutlet weak var taskTitle: UITextField!
@IBOutlet weak var taskDetail: UITextView!

var taskToEdit: Task?

weak var delegate: DetailViewControllerDelegate? // Required to carry out the protocol methods

override func viewDidLoad() {
super.viewDidLoad()

taskTitle.text = selectedTask
taskDetail.text = taskDetails

taskDetail.textColor = UIColor.lightGray
navigationItem.largeTitleDisplayMode = .never
}

func textViewDidBeginEditing(_ textView: UITextView) {
if taskDetail.textColor == UIColor.lightGray {
taskDetail.text = nil
taskDetail.textColor = UIColor.black
}
}

func textViewDidEndEditing(_ textView: UITextView) {
if taskDetail.text.isEmpty {
taskDetail.text = "Details..."
taskDetail.textColor = UIColor.lightGray
}
}

override func viewWillAppear(_ animated: Bool) {
taskTitle.becomeFirstResponder()
}


@IBAction func doneButtonPressed(_ sender: UIBarButtonItem) {
let newTask = Task(context: self.context)
newTask.title = taskTitle.text!
newTask.details = taskDetail.text!
newTask.parentCategory = taskCategory!

delegate?.detailViewController(self, didFinishAdding: newTask)

// self.taskArray.append(newTask)
self.saveTasks()

navigationController?.popViewController(animated: true)

}


func saveTasks() {

do {
try context.save()
} catch {
print("Error saving context \(error)")
}
}

}

这是来自 ListView Controller 的代码,它应该在新项目创建后立即显示:

import UIKit
import CoreData

class TaskListTableViewController: UITableViewController, DetailViewControllerDelegate {

var tasks = [Task]()
var selectedCategory: Category? {
didSet {
loadTasks()
}
}
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext



override func viewDidLoad() {
super.viewDidLoad()

navigationItem.largeTitleDisplayMode = .never

title = selectedCategory?.name
loadTasks()
tableView.reloadData()

// self.navigationItem.rightBarButtonItem = self.editButtonItem
}

func detailViewController(_ controller: DetailViewController, didFinishAdding task: Task) {

let newRowIndex = tasks.count
tasks.append(task)
let indexPath = IndexPath(row: newRowIndex, section: 0)
let indexPaths = [indexPath]
tableView.insertRows(at: indexPaths, with: .automatic)
tableView.reloadData()

navigationController?.popViewController(animated: true)
}


// TODO: finish this
func detailViewController(_ controller: DetailViewController, didFinishEditing task: Task) {

}


// MARK: - Table view data source

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return tasks.count
}


override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "TaskCell", for: indexPath)

let task = tasks[indexPath.row]
let label = cell.viewWithTag(1001) as! UILabel
label.text = task.title

return cell
}


// MARK: - Navigation

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "AddItem" {
let destinationVC = segue.destination as! DetailViewController
destinationVC.taskCategory = selectedCategory
} else if segue.identifier == "EditItem" {
let destinationVC = segue.destination as! DetailViewController
destinationVC.taskCategory = selectedCategory
let indexPath = tableView.indexPathForSelectedRow!
let task = tasks[indexPath.row]
destinationVC.selectedTask = task.title
destinationVC.taskDetails = task.details

}
}


func loadTasks(with request: NSFetchRequest<Task> = Task.fetchRequest(), predicate: NSPredicate? = nil) {

let categoryPredicate = NSPredicate(format: "parentCategory.name MATCHES %@", selectedCategory!.name!)

request.predicate = categoryPredicate

do {
tasks = try context.fetch(request)
} catch {
print("Error fetching data \(error)")
}

tableView.reloadData()
}

@IBAction func addTaskButton(_ sender: UIBarButtonItem) {
print("new task added")
}

}

最佳答案

你需要在prepareForSegue中设置delegate

destinationVC.delegate = self

关于ios - 如何让新项目显示在 ListView 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50866278/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com