【问题标题】: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 是否可以参考我的代码使用示例?

标签: ios swift uitableview core-data


【解决方案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?

建议:

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

学习:

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

参考资料:

【讨论】:

  • friendslistViewController.swift 中的代码是否替换了我现有的override func tableView 代码?不知道去哪里
  • 在 Swift func tableView 中不是完整的函数名。 tableView: didSelectRowAt: 是函数的名称。所以这是一个附加功能,不会取代您的任何功能。我认为你最好学习 Swift 语言的基础知识
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多