将核心数据值传递到文本字段以进行编辑/保存
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 语言的基础知识以上是关于将核心数据值传递到文本字段以进行编辑/保存的主要内容,如果未能解决你的问题,请参考以下文章