Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 将数据从viewcontroller tableview传递到另一个视图控制器_Swift_Xcode_Core Data_Tableview - Fatal编程技术网

Swift 将数据从viewcontroller tableview传递到另一个视图控制器

Swift 将数据从viewcontroller tableview传递到另一个视图控制器,swift,xcode,core-data,tableview,Swift,Xcode,Core Data,Tableview,我在将数据从表视图控制器传递到另一个视图控制器时遇到问题。我正在尝试将用户的名称传递给另一个视图控制器。到目前为止,核心数据通过存储用户的姓名和删除单元格中人员的姓名来工作,但当我从列表中选择一个用户时,它不会将我带到下一个视图控制器 class tableViewController: UITableViewController { @IBOutlet weak var tableview: UITableView! //Properties var people: [NSManagedO

我在将数据从表视图控制器传递到另一个视图控制器时遇到问题。我正在尝试将用户的名称传递给另一个视图控制器。到目前为止,核心数据通过存储用户的姓名和删除单元格中人员的姓名来工作,但当我从列表中选择一个用户时,它不会将我带到下一个视图控制器

class tableViewController: UITableViewController {

@IBOutlet weak var tableview: UITableView!

//Properties
var people: [NSManagedObject] = []

override func viewDidLoad() {
    super.viewDidLoad()

    title = "The List"
    tableview.register(UITableViewCell.self, forCellReuseIdentifier: "Cell")
    // Do any additional setup after loading the view, typically from a nib.
}
//Fetching data from the core data
override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    //1. Before requesting to coredata, it needs a managed object context.
    guard let appDelegate =
        UIApplication.shared.delegate as? AppDelegate else {
            return
    }

    let managedContext =
        appDelegate.persistentContainer.viewContext

    //2. Using NSFetchRequest class to fetch core data. Fetching all obejcts within an entity (Person).
    let fetchRequest =
        NSFetchRequest<NSManagedObject>(entityName: "Person")

    //3. Putting in the fetch request to the managed object context, to get fetch data.
    do {
        people = try managedContext.fetch(fetchRequest)
    } catch let error as NSError {
        print("Could not fetch. \(error), \(error.userInfo)")
    }
}
//Adding the person's name into the table view when the clicks on the add button and enter in their name.
@IBAction func addName(_ sender: UIBarButtonItem) {
    let alert = UIAlertController(title: "New Name",
                                  message: "Add a new name",
                                  preferredStyle: .alert)

    let saveAction = UIAlertAction(title: "Save", style: .default) {
        [unowned self] action in

        guard let textField = alert.textFields?.first,
            let nameToSave = textField.text else {
                return
        }

        self.save(name: nameToSave)
        self.tableview.reloadData()
    }

    let cancelAction = UIAlertAction(title: "Cancel",
                                     style: .default)

    alert.addTextField()

    alert.addAction(saveAction)
    alert.addAction(cancelAction)

    present(alert, animated: true)
}

// Where the coredata is stored.
func save(name: String) {

guard let appDelegate =
    UIApplication.shared.delegate as? AppDelegate else {
        return
}

//1.Before saving or retrieving from core data, NSManagedObjectContext is to be implemented. Managed context is considered s in-memory to working with managed object context.
let managedContext =
    appDelegate.persistentContainer.viewContext

//2. Creating new managed object and inserting it into managed object context. NSEntityDescrption links he entity definitionfrom data model with an instance of NSanagedObject at runtime.
let entity =
    NSEntityDescription.entity(forEntityName: "Person",
                               in: managedContext)!

let person = NSManagedObject(entity: entity,
                             insertInto: managedContext)

//3. The "name" attribute is set using the key value coding. KVC key (name) should be spelt as diplayed in data model else app could crash at run time.
person.setValue(name, forKeyPath: "name")

//4. Changed are saved to the disk using the managed object context. Save could bring an error which is why try is used within do and catch block. The new managed object is inserted into the "people" array, so it appears when table view is reloaded.
do {
    try managedContext.save()
    people.append(person)
} catch let error as NSError {
    print("Could not save. \(error), \(error.userInfo)")
}
}
}

// MARK: - UITableViewDataSource
extension tableViewController: UITableViewDataSource {
override func tableView(_ tableView: UITableView,
               numberOfRowsInSection section: Int) -> Int {
    return people.count
}

override func tableView(_ tableView: UITableView,
               cellForRowAt indexPath: IndexPath)
    -> UITableViewCell {

        let person = people[indexPath.row]
        let cell =
            tableView.dequeueReusableCell(withIdentifier: "Cell",
                                          for: indexPath)
        cell.textLabel?.text =
            person.value(forKeyPath: "name") as? String
        return cell
}

override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
    if editingStyle == .delete {
        //print("Deleted")

        //short-cut to access App Delegate
        let ad = UIApplication.shared.delegate as! AppDelegate
        let context = ad.persistentContainer.viewContext
        ad.saveContext()

        context.delete(people[indexPath.row])
        people.remove(at: indexPath.row)
        tableView.reloadData()
    }
}
// MARK: - Navigation

// In a storyboard-based application, you will often want to do a little    preparation before navigation
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

}
类tableViewController:UITableViewController{
@IBVAR表格视图:UITableView!
//性质
var人员:[NSManagedObject]=[]
重写func viewDidLoad(){
super.viewDidLoad()
title=“列表”
tableview.register(UITableViewCell.self,强制重用标识符:“单元格”)
//加载视图后,通常从nib执行任何其他设置。
}
//从核心数据获取数据
覆盖函数视图将出现(uo动画:Bool){
超级。视图将显示(动画)
//1.在请求coredata之前,它需要一个托管对象上下文。
警卫让appDelegate=
UIApplication.shared.delegate作为?AppDelegate else{
返回
}
让managedContext=
appDelegate.persistentContainer.viewContext
//2.使用NSFetchRequest类获取核心数据。获取实体(个人)内的所有OBEJCT。
让我们请求=
NSFetchRequest(entityName:“个人”)
//3.将fetch请求放入托管对象上下文,以获取fetch数据。
做{
people=尝试managedContext.fetch(fetchRequest)
}将let错误捕获为NSError{
打印(“无法获取.\(错误),\(错误.userInfo)”)
}
}
//单击add按钮并输入姓名时,将人员的姓名添加到表视图中。
@iAction func addName(uu发件人:UIBarButtonim){
let alert=UIAlertController(标题:“新名称”,
消息:“添加新名称”,
preferredStyle:。警报)
让saveAction=UIAlertAction(标题:“保存”,样式:。默认值){
[无主的自我]行动
guard let textField=alert.textFields?首先,
让nameToSave=textField.text else{
返回
}
self.save(名称:nameToSave)
self.tableview.reloadData()
}
让cancelAction=UIAlertAction(标题:“取消”,
样式:。默认值)
alert.addTextField()
alert.addAction(saveAction)
alert.addAction(取消操作)
当前(警报、动画:真)
}
//存储coredata的位置。
func保存(名称:字符串){
警卫让appDelegate=
UIApplication.shared.delegate作为?AppDelegate else{
返回
}
//1.在保存或从核心数据检索之前,需要实现NSManagedObjectContext。托管上下文被认为是内存中用于处理托管对象上下文的对象。
让managedContext=
appDelegate.persistentContainer.viewContext
//2.创建新的托管对象并将其插入托管对象上下文。NSEntityDescription在运行时将数据模型中的实体定义与NSanagedObject的实例链接起来。
让实体=
NSEntityDescription.entity(名称:“Person”,
在:managedContext)中!
让person=NSManagedObject(实体:实体,
插入到:managedContext)
//3.使用键值编码设置“name”属性。KVC键(name)应在数据模型中拼写为diplayed,否则应用程序可能在运行时崩溃。
person.setValue(名称,forKeyPath:“名称”)
//4.使用托管对象上下文将更改的对象保存到磁盘。保存可能会带来一个错误,这就是为什么在do和catch块中使用try。新的托管对象插入到“人员”数组中,因此在重新加载表视图时显示。
做{
请尝试managedContext.save()
people.append(person)
}将let错误捕获为NSError{
打印(“无法保存.\(错误),\(错误.用户信息)”)
}
}
}
//标记:-UITableViewDataSource
扩展tableViewController:UITableViewDataSource{
重写func tableView(tableView:UITableView,
numberOfRowsInSection部分:Int)->Int{
返回人。计数
}
重写func tableView(tableView:UITableView,
cellForRowAt indexPath:indexPath)
->UITableViewCell{
让person=people[indexPath.row]
让细胞=
tableView.dequeueReusableCell(标识符为“Cell”,
for:indexath)
cell.textLabel?.text=
person.value(forKeyPath:“name”)作为?字符串
返回单元
}
重写func tableView(tableView:UITableView,commit editingStyle:UITableViewCellEditingStyle,forRowAt indexPath:indexPath){
如果editingStyle==.delete{
//打印(“已删除”)
//访问应用程序代理的捷径
将ad=UIApplication.shared.delegate设为!AppDelegate
让context=ad.persistentContainer.viewContext
ad.saveContext()
context.delete(人[indexPath.row])
people.remove(位于:indexPath.row)
tableView.reloadData()
}
}
//标记:-导航
//在基于故事板的应用程序中,您通常需要在导航之前做一些准备
覆盖功能准备(对于segue:UIStoryboardSegue,发送方:有吗?){
}

}

那么您想在从tableview中选择后将所选人员传递给下一个ViewController吗

首先为您选择的人声明一个类变量

var selectedPerson: NSManagedObject?
然后你需要实现这个功能

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    selectedPerson = people[indexPath.row]
    self.performSegue(withIdentifier: "showPerson", sender: nil)
}
之后,将当前函数编辑为

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "showPerson" {
        if let personController = segue.destination as? YOURPERSONCONTROLLERCLASS {
            personController.person = selectedPerson
        }
    }
}

您必须将PersonController类更改为viewcontroller类,该类还需要一个NSManagedObject类型的变量person。

相关代码部分在哪里?如果您正在查找,请单击我答案左侧的勾号图标接受它。谢谢