2016-12-29 2 views
0

CoreData을 사용하는 데이터 입력 목록이있는 TableViewController이 있습니다. 나는 ViewControllerUITextView을 가지고 Segue가 TableViewController에 연결되어 있습니다. 항목 추가, 저장 및 삭제와 같은 작업을 완료했습니다. Swift에서 TableViewCell의 내용 목록을 편집하십시오

는 지금은 SEGUE를 사용하여 다음 ViewController의 텍스트 뷰에 선택한 셀에서 데이터를 전달할 수 ViewController.I 오전에서 수행하는 작업을 만들었습니다 .I 다음 ViewControllerUITextView 선택한 TableViewCell를 연결하여 편집 작업입니다.

이제 UITextView의 편집 된 텍스트를 TableViewController의 셀로 돌아가려면 DONE 버튼을 클릭하고 데이터는 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

Himanshu Moradiya @ U는 아무런 생각이 없습니다., ... U는 upvotes 및 승인을위한 미끼 용입니다. 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에 는 managedContext = appDelegate.managedObjectContext 할 일 { managedContext.save 시도() } 캐치 { 인쇄 ("오류") } U는 질문을 편집 할 수하고자하는 경우 나 질문을 할 수 있습니다. @ Dheeraj D –

+0

TextViewController에서 편집을 마치면 recent.item = string을 씁니다. 완료 버튼 액션 –

+0

에있는 모든 remaning 코드를 확인하고 되돌릴 수 있습니다. –

관련 문제