将核心数据值传递到文本字段以进行编辑/保存

Posted

技术标签:

【中文标题】将核心数据值传递到文本字段以进行编辑/保存【英文标题】:Pass core data values into text fields for editing/saving 【发布时间】:2017-10-15 04:24:40 【问题描述】:

我是使用 Xcode 和 swift 的新手,还在学习。我无法将核心数据从实体传递到文本字段/标签,然后用户可以选择编辑和保存记录。我的目标是当用户从friendslistViewController.swift 中单击tableView 中的一个单元格时,它会将它们带到editViewController.swift 屏幕以编辑和保存记录。我想我需要实现prepareforsegue 函数,但不知道怎么做?

friendsViewController.swift(初始数据输入)

//
//  friendsViewController.swift
// 
//
//  Created by on 11/10/17.
//  Copyright © 2017. All rights reserved.
//

import UIKit
import CoreData

class friendsViewController: UIViewController 

        //OUTLETS


    @IBOutlet weak var firstName: UITextField!        
    @IBOutlet weak var lastName: UITextField!        
    @IBOutlet weak var genderSegControl: UISegmentedControl!        
    @IBOutlet weak var ageStepper: UIStepper!

    //AGECOUNT
    @IBOutlet weak var ageLabel: UILabel!        
    @IBOutlet weak var address: UITextField!

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

    override func viewDidLoad() 
        super.viewDidLoad()    
        // Do any additional setup after loading the view.
    

    //actions

    @IBAction func ageStepperStep(_ sender: UIStepper) 
        let step = Int(sender.value) // using an integer variable
        ageLabel.text = String(step)
        // label1.text = Int(sender.value).description
        // another way without using any integer variable
    


    // TEST GENDER
    /*

        var gender : String
        if self.genderSegControl.selectedSegmentIndex == 0 
            gender = "male"
        
        else 
            gender = "female"
        
        genderLabel.text! = gender

 */

   //SAVE FRIEND BUTTON
    @IBAction func saveFriendBtn(_ sender: Any) 

        if firstName.text != "" && lastName.text != ""                

            var gender : String?
            if self.genderSegControl.selectedSegmentIndex == 0 
                gender = "male"
            
            else 
                gender = "female"
            


            let newFriend = NSEntityDescription.insertNewObject(forEntityName: "Friends", into: context)
            newFriend.setValue(self.firstName.text, forKey: "firstName")
            newFriend.setValue(self.lastName.text, forKey: "lastName")
            newFriend.setValue(self.address.text, forKey: "address")
            newFriend.setValue(self.ageLabel.text, forKey: "age")
            newFriend.setValue(gender, forKey: "gender")

            /*let gender: String = genderSegControl.titleForSegment(at: genderSegControl.selectedSegmentIndex)!
 */


            //SAVE THE CONTEXT
            do 
                try context.save()
            
            catch
                print(error)
            
         
        else 
            print("please enter your first and last name!")
        
    

 //end class

friendslistViewController.swift(显示带有单元格的 tableView 的屏幕)

//
//  friendslistViewController.swift
// 
//
//  Created by on 11/10/17.
//  Copyright © 2017. All rights reserved.
//

import UIKit
import CoreData

class friendslistViewController: UIViewController, UITableViewDelegate, UITableViewDataSource 

    /*
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
        var DestViewController : editViewController = segue.destinationViewController as! editViewController

        DestViewController.firstNameInput = name.firstName!
    
 */

    //outlets

    @IBOutlet weak var tableView: UITableView!

    var userArray:[Friends] = []

    override func viewDidLoad() 
        super.viewDidLoad()            

        tableView.delegate = self
        tableView.dataSource = self

        self.fetchData()
        self.tableView.reloadData()


        // Do any additional setup after loading the view.
    

    func numberOfSections(in tableView: UITableView) -> Int 
        return 1
    


    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return userArray.count
    


    //DISPLAY LISTVIEW
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
        //save first users data into array
        let name = userArray[indexPath.row]
        cell.textLabel!.text = name.firstName! + " " +
            name.lastName! + ", " +
            name.age! + ", " +
            name.gender! + ", " +
            name.address!

        return cell
    


    func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) 

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

        if editingStyle == .delete

            //delete a friend
            let friend = userArray[indexPath.row]
            context.delete(friend)
            (UIApplication.shared.delegate as! AppDelegate).saveContext()

            do
                userArray = try context.fetch(Friends.fetchRequest())

            catch
                print(error)
            

        
        tableView.reloadData()

    

    //fetch the data
    func fetchData()
        let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext

        do
            userArray = try context.fetch(Friends.fetchRequest())
        
            //if error exists/catch it
        catch
            print(error)
        
    

    //actions
  //end class

editViewController.swift(处理编辑/保存的屏幕)

//
//  editViewController.swift
// 
//
//  Created by  on 15/10/17.
//  Copyright © 2017. All rights reserved.
//

import UIKit

import CoreData

class editViewController: UIViewController 

    @IBOutlet weak var firstName: UITextField!        
    @IBOutlet weak var lastName: UITextField!        
    @IBOutlet weak var ageLabel: UILabel!        
    @IBOutlet weak var address: UITextField!

    var firstNameInput = String()

    override func viewDidLoad() 
        super.viewDidLoad()

        firstName.text = firstNameInput

        // Do any additional setup after loading the view.
    

 

【问题讨论】:

使用didSelectRow 的tableview 方法来执行segue,显然你必须实现prepareForSegue 方法 @3stud1ant3 是否可以参考我的代码使用示例? 【参考方案1】:

首先,您应该更改视图控制器的名称,使它们都以大写字母开头(例如class FriendsViewController: UIViewController)并对文件名执行相同操作。

其次,您需要添加一个转场是正确的。您是否查看过 Apple 文档中的 func prepare(for segue: UIStoryboardSegue, sender: Any?)

您需要在目标视图控制器 (editViewController.swift) 中有一个变量,您可以将 Friend 对象分配给该变量。在您的prepare(for:sender:) 方法中,您需要类似let destinationViewController = segue.destination as! EditViewController 的内容。然后,您可以使用该 destinationViewController 变量访问目标视图控制器中的变量并将对象分配给它。

看看你能走多远。

【讨论】:

对不起,我有点困惑。可以举个例子吗? 在请别人为你写例子之前,你真的应该做一些研究并尝试自己实现一些东西。您应该这样做,因为它是一种很好的学习方式,并且因为在提出关于 SO 的问题时需要它。如果您进行了研究,请发布您编写的不起作用的代码,您将获得更多帮助。【参考方案2】:

代码更改:

1。 friendslistViewController.swift

//Change this to match your segue
private let showEditSegueID = "Edit Friend" 

private var selectedIndexPath : IndexPath?

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
    
    selectedIndexPath = indexPath
    
    performSegue(withIdentifier: showEditSegueID, sender: self)


override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
    
    switch segue.identifier 
        
    case .some(showEditSegueID):
        
        if let editViewController = segue.destination as? editViewController,
            let selectedIndexPath = selectedIndexPath 
            
            let friend = userArray[selectedIndexPath.row]
            editViewController.friend = friend
        
        
    default:
        break
    

2。 editViewController.swift

weak var friend : Friends?

建议:

    确保类名以大写开头 让核心数据实体名称为单数,以便代表它保存的每条记录。 在开始构建应用之前了解基础知识。 学习基础知识最初需要时间,但在学习过程中会省去很多麻烦。

学习:

    学习 Swift 语言 了解如何构建应用 学习核心数据

参考资料:

https://itunes.apple.com/us/book/the-swift-programming-language-swift-4/id881256329?mt=11 https://itunes.apple.com/us/course/developing-ios-10-apps-with-swift/id1198467120 https://developer.apple.com/library/content/documentation/DataManagement/Devpedia-CoreData/coreDataOverview.html https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreData/index.html#//apple_ref/doc/uid/TP40001075-CH2-SW1 https://developer.apple.com/library/content/documentation/DataManagement/Devpedia-CoreData/coreDataOverview.html

【讨论】:

friendslistViewController.swift 中的代码是否替换了我现有的override func tableView 代码?不知道去哪里 在 Swift func tableView 中不是完整的函数名。 tableView: didSelectRowAt: 是函数的名称。所以这是一个附加功能,不会取代您的任何功能。我认为你最好学习 Swift 语言的基础知识

以上是关于将核心数据值传递到文本字段以进行编辑/保存的主要内容,如果未能解决你的问题,请参考以下文章

在编辑另一个文本字段 vue.js 时获取计算属性并传递其值

以编程方式将文本字段值传递给另一个视图中的标签

如何在模态(表单)中传递数据来编辑值?

颤振:如何在 api 正文中传递文本字段值

将多个值传递给核心数据迁移策略函数

无法保存到核心数据中