2016-12-29 12 views
0

CoreDataを使用してデータエントリのリストを持つTableViewControllerがあります。また、ViewControllerUITextViewがあり、SegueによってTableViewControllerにリンクしています。アイテムの追加、保存、削除などの操作を完了しました。今、私は次のViewController .IにUITextViewに選択TableViewCellをリンクすることにより、編集に取り組んでいますSwiftでTableViewCellのコンテンツリストを編集

はセグエを使用して次のViewControllerのTextViewのに選択したセルのデータを渡すことができViewController.I午前にDONEアクションを作成しました。

UITextViewの編集済みテキストを更新するには、DONEボタンをクリックしてTableViewControllerのセルに戻り、データをCoreDataに保存する必要があります。 Plzzは本当のアドバイスや提案をしてくれます....私はSwiftを初めて使っています。ここに私のコードを入れました。

import UIKit 
import CoreData 

class ToDoTableViewController: UITableViewController { 
var listItems = [NSManagedObject]() 

override func viewDidLoad() { 
super.viewDidLoad() 
self.navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.add, target: self , action: #selector(ToDoTableViewController.addItem)) 
} 

func addItem(){ 
let alertController = UIAlertController(title: "To Do Tasks Lists!!!!", message: "Write Down...", preferredStyle: .alert) 
let confirmAction = UIAlertAction(title: "Confirm", style: UIAlertActionStyle.default, handler: ({ 
    (_) in 
    if let field = alertController.textFields![0] as? UITextField { 
     self.saveItem(itemToSave: (field.text!)) 
     self.tableView.reloadData() 
    } 
    } 
)) 

let cancelAction = UIAlertAction(title: "Cancel", style: UIAlertActionStyle.cancel, handler: nil) 
alertController.addTextField(configurationHandler: ({ 
    (textField) in 
    textField.placeholder = "Type in Something!!!!" 
})) 

alertController.addAction(confirmAction) 
alertController.addAction(cancelAction) 
self.present(alertController, animated: true, completion: nil) 
} 

func saveItem(itemToSave : String){ 
let appDelegate = UIApplication.shared.delegate as! AppDelegate 
let managedContext = appDelegate.managedObjectContext 
let entity = NSEntityDescription.entity(forEntityName: "ListEntity", in: managedContext) 
let item = NSManagedObject(entity: entity!, insertInto: managedContext) 
item.setValue(itemToSave, forKey: "item") 
do { 
    try managedContext.save() 
    listItems.append(item) 
} 
catch { 

    print("Error") 
} 
} 

override func viewWillAppear(_ animated: Bool) { 
let appDelegate = UIApplication.shared.delegate as! AppDelegate 
let managedContext = appDelegate.managedObjectContext 
let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "ListEntity") 

do{ 
    let results = try managedContext.fetch(fetchRequest) 
    listItems = results as! [NSManagedObject] 
} 
catch { 
    print("Error") 
} 
} 

override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool { 
return true 
} 

override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) { 
if editingStyle == .delete { 
    let appDelegate = UIApplication.shared.delegate as! AppDelegate 
    let managedContext = appDelegate.managedObjectContext 
    let objectToDelete = listItems[indexPath.row] 
    listItems.remove(at: indexPath.row) 
    managedContext.delete(objectToDelete) 
    tableView.deleteRows(at: [indexPath], with: .fade) 
    do { 
     try managedContext.save() 
    } 
    catch { 
     print("Error") 
    } 
} 
} 

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

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell")! as UITableViewCell 
let item = listItems[indexPath.row] 
cell.textLabel?.text = item.value(forKey: "item") as! String? 
cell.backgroundColor = UIColor.clear 
return cell 
} 

func getIndexPathForSelectedCell() -> IndexPath? 
{ 
var indexPath2:IndexPath? 
if tableView.indexPathsForSelectedRows!.count > 0 { 
    indexPath2 = tableView.indexPathsForSelectedRows![0] 
} 
return indexPath2 
} 

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
if (segue.identifier == "detailView") 
{ 
    if let indexPath2 = getIndexPathForSelectedCell() 
    { 
     // here write code for move to next controller. 
     let vc = segue.destination as! TextEditViewController 
     //vc.FirstString = listItems[(indexPath2 as NSIndexPath).row] as String 

     let item = listItems[(indexPath2 as NSIndexPath).row] 
     vc.FirstString = (item.value(forKey: "item") as! String?)! 
    } 
} 
} 

} 


//TextEditViewController 
import UIKit 
import CoreData 
class TextEditViewController: UIViewController { 
@IBOutlet weak var textEdit: UITextView! 
var FirstString = String()  

override func viewDidLoad() { 
super.viewDidLoad() 
textEdit.text = FirstString 
print(self.FirstString) 
} 

override func didReceiveMemoryWarning() { 
super.didReceiveMemoryWarning() 
// Dispose of any resources that can be recreated. 
} 

} 
+0

プリントアイテムデータ&そこにデバッグを入れてチェックしてください –

+0

ひまんじモラディアイア@ Uは何も考えていません,,,アップフォースと承認のための餌のためにここにいます。 Uは前に私の問題を解決しませんでした! –

+0

secondVCで編集した後にcoredataのテキストを更新し、FirstVCにあるtableviewに表示しますか? –

答えて

0

次の画面へのごCoreDataモデルの参照を渡します。

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
if (segue.identifier == "detailView") 
{ 
    if let indexPath2 = getIndexPathForSelectedCell() 
    { 
     // here write code for move to next controller. 
     let vc = segue.destination as! TextEditViewController 
     //vc.FirstString = listItems[(indexPath2 as NSIndexPath).row] as String 
     let item = listItems[(indexPath2 as NSIndexPath).row] 
     vc.FirstString = (item.value(forKey: "item") as! String?)! 
     vc.recentItem = item; //Like this. Create a recentItem refrence to your next controller of NSManagedObject or your custom core data modal. 
    } 
} 
} 

あなたがTextEditViewControllerであなたの編集が終わったら:

recentItem.item = "String" //Your updated string 

let appDelegate = UIApplication.shared.delegate as! AppDelegate 
    let managedContext = appDelegate.managedObjectContext 
do { 
     try managedContext.save() 
    } 
    catch { 
     print("Error") 
    } 

希望これは動作します...!

+0

どこにこの卿を追加しますか? recentItem.item = "String" //更新された文字列 appDelegate = UIApplication.shared.delegateを! AppDelegate はUの願いは、私は尋ねた質問を編集することができた場合managedContext = appDelegate.managedObjectContext キャッチ{ 印刷( "エラー") } { () managedContext.saveを試し}やってみましょう。 @ Dheeraj D –

+0

TextViewControllerには、編集を終えたときにrecent.item = stringと書いてください。 Doneボタンアクション –

+0

のすべてのremaningコードが私にチェックさせて元に戻します –

関連する問題