Приложение My To-Do уже добавило и удалило (из основных данных) функциональность. Это сработало отлично. Моя проблема в том, что моя попытка добавить редактирование не работает.Редактирование элемента списка основных данных вместо добавления
Поведение
Я закодирован так, если пользователь вводит задание в таблице, она устанавливает эту задачу в индексе ячейки пути, название и описание к переменным и передает их модальную ViewController для редактирования. Представлен модальный вид, а затем переданные переменные заполняют текстовые поля. Затем пользователь может отредактировать существующий контент и нажать «Сохранить», в котором выполняется некоторый код сохранения (я расскажу ниже). Модальное представление отклоняется, данные таблицы перезагружаются, а ячейка отображается только там, где она была раньше, но с обновленным контентом. ЭТО ВСЕ РАБОТАЕТ. Неисправность происходит при закрытии/полном отключении приложения и повторном его открытии. Внезапно возвращается исходная задача, но копия с изменениями добавляется к нижней части списка.
Вопрос
Почему мой код делает это, и как я могу получить отредактированное название и описание для сохранения и загрузки правильно?
Информация
Мое ядро имя файла данных: CD_Model Мое имя сущности является: TodayTask Мои имена атрибутов являются: 1) "Имя" 2) "по убыванию"
Код
Я включил много своего кода в случае, если ошибка где-то я не ожидаю. Однако я добавил смелые к заголовкам двух фрагментов, которые, как я думаю, вызывают проблемы. Ошибка обнаруживается только при запуске viewDidLoad (первый фрагмент кода ниже). Но ошибка может произойти в последнем фрагменте - функции сохранения.
Импорт & Глобальных переменные:
import UIKit
import CoreData
var todayTaskList = [NSManagedObject]()
var passingEdit = false
декларация и viewDidLoad основных ОК, который содержит таблицу:
class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
//***** ----- ***** ------ ***** ----- ***** ----- *****
//Initial Setup
//***** ----- ***** ------ ***** ----- ***** ----- *****
@IBOutlet weak var tableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
//This loads the list from Core Data
//1
let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
let managedContext = appDelegate.managedObjectContext!
//2
let fetchRequest = NSFetchRequest(entityName:"TodayTask")
//3
var error: NSError?
let fetchedResults = managedContext.executeFetchRequest(fetchRequest, error: &error) as? [NSManagedObject]
if let results = fetchedResults {
todayTaskList = results
} else {
println("Could not fetch \(error), \(error!.userInfo)")
}
//This provides a variable height for each row
tableView.rowHeight = UITableViewAutomaticDimension
tableView.estimatedRowHeight = 80.0
}
код для создания таблицы:
//***** ----- ***** ------ ***** ----- ***** ----- *****
//Table View & Cell Setup
//***** ----- ***** ------ ***** ----- ***** ----- *****
@IBOutlet weak var name_Label: UILabel!
@IBOutlet weak var desc_Label: UILabel!
//Tells the table how many rows it should render
//*Looks to the Core Data NSObject to count tasks
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return todayTaskList.count
}
//Creates the individual cells. If the above function returns 3, this runs 3 times
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
//Setup variables
let cellIdentifier = "BasicCell"
let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as! CustomTableViewCell
let task = todayTaskList[indexPath.row]
//Create table cell with values from Core Data attribute lists
cell.nameLabel!.text = task.valueForKey("name") as? String
cell.descLabel!.text = task.valueForKey("desc") as? String
//Make sure the row heights adjust properly
tableView.rowHeight = UITableViewAutomaticDimension
tableView.estimatedRowHeight = 80.0
return cell
}
Код запускается, когда exis Задача тин сливают:
//***** ----- ***** ------ ***** ----- ***** ----- *****
//Functions
//***** ----- ***** ------ ***** ----- ***** ----- *****
//Action: Edit list item on row tap
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
passingEdit = true
performSegueWithIdentifier("modalToEditor", sender: nil)
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if (segue.identifier == "modalToEditor") && passingEdit == true {
//Assign selection to a variable 'currentCell'
let indexPath = tableView.indexPathForSelectedRow();
let currentCell = tableView.cellForRowAtIndexPath(indexPath!) as! CustomTableViewCell;
//Set cell text into variables to pass to editor
var cellNameForEdit = currentCell.nameLabel!.text
var cellDescForEdit = currentCell.descLabel.text
//Pass values to EditorView
var editorVC = segue.destinationViewController as! EditorView;
editorVC.namePassed = cellNameForEdit
editorVC.descPassed = cellDescForEdit
editorVC.indexOfTap = indexPath
}
}
Декларация модального редактора ВК, переменные, переданные из основной VC установлены:
class EditorView: UIViewController, UITextFieldDelegate {
//Declare outlets and vars
@IBOutlet var txtTask: UITextField!
@IBOutlet var txtDesc: UITextView!
@IBOutlet weak var addSave: UIButton!
@IBOutlet weak var cancel: UIButton!
var namePassed: String!
var descPassed: String!
var indexOfTap: NSIndexPath!
//Initial Functions
override func viewDidLoad() {
super.viewDidLoad()
self.txtTask.becomeFirstResponder()
if passingEdit == true {
txtTask.text = namePassed
txtDesc.text = descPassed
addSave.setTitle("Save", forState: UIControlState.Normal)
}
else {
addSave.setTitle("Add", forState: UIControlState.Normal)
}
}
Запуск функции при нажатии на кнопку сохранения:
func modRec(nameValue: String, descValue: String, indexPos: NSIndexPath) {
//1
let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
let managedContext = appDelegate.managedObjectContext!
//2
let entity = NSEntityDescription.entityForName("TodayTask", inManagedObjectContext: managedContext)
let todayTask = NSManagedObject(entity: entity!, insertIntoManagedObjectContext:managedContext)
//3
todayTask.setValue(nameValue, forKey: "name")
todayTask.setValue(descValue, forKey: "desc")
//4
var error: NSError?
if !managedContext.save(&error) {
println("Could not save \(error), \(error?.userInfo)")
}
//5
todayTaskList[indexPos.row] = todayTask
managedContext.save(nil)
}
Это было. В значительной степени просто вырезать/вставить. Спасибо. –