首页 > 解决方案 > 如何将项目从初始(一次)第一次视图控制器传递到主视图控制器并使用核心数据保存该数据

问题描述

我已经在这个问题上工作了两天,遗憾的是我无法弄清楚我的问题的问题。我正在尝试从我最初的一次性视图控制器中获取一项并将其发送到我的主视图控制器,在那里它将保存在主视图控制器中,并在重新加载应用程序时出现在该控制器上。

这是我的“第一次”视图控制器的应用程序委托代码

 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

    if UserDefaults.standard.bool(forKey: "firstTimer") {
    let storyBoard = UIStoryboard.init(name: "Main", bundle: nil)
    let mainView = storyBoard.instantiateViewController(withIdentifier: "MainViewControllerID")
        let nav = UINavigationController(rootViewController: mainView)
        nav.navigationBar.isHidden = true
        self.window?.rootViewController = nav
    }
    return true
}

容器和 saveContext 是默认的

import UIKit

import CoreData

class FirstTimeViewController: UIViewController {

let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
 private var appDelegate = UIApplication.shared.delegate as! AppDelegate
private var player = [Player]()





@IBOutlet weak var nameTextField: UITextField!

override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.
}

// This View Controller will only be used once upon the first time the app is being used.

// MARK: Make func that prepares for segue on initial opening of app


override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "toMainViewController" {
        let mainViewController = segue.destination as! UINavigationController
        let destination = mainViewController.topViewController as! MainViewController
        if let newPlayer = self.nameTextField.text{
            destination.name.name = newPlayer
            destination.playerData.name = newPlayer
            saveItems()
        }
    }

}

@IBAction func continueButtonPressed(_ sender: UIStoryboardSegue) {
    UserDefaults.standard.set(true, forKey: "firstTimer")
    let mainPlayer = PlayerData()
    let player1 = Player(entity: Player.entity(), insertInto: context)
    player1.name = mainPlayer.name
    performSegue(withIdentifier: "toMainViewController", sender: self)
    saveItems()
}


func saveItems() {
    do {
    try context.save()
        print("File Successfully saved!")
    }catch {
       print("Error saving Context \(error)")
    }
}



// MARK: Function to Save and Load data??
/*
// 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?) {
    // Get the new view controller using segue.destination.
    // Pass the selected object to the new view controller.
}
*/

func loadItems() {
    let request = Player.fetchRequest() as NSFetchRequest<Player>
    do {
        player = try context.fetch(request)
        print("Info loaded")
    } catch {
        print("Error fetching data from context \(error)")
    }
}
}

MainViewController 正在发送信息。我只想发送一项并将其保存到该主视图控制器。

import UIKit
import Foundation
import CoreData

class MainViewController: UIViewController {
//set up model object, buttons, and labels
//    let player: Player!
let context = (UIApplication.shared.delegate as!          AppDelegate).persistentContainer.viewContext
private var appDelegate = UIApplication.shared.delegate as! AppDelegate
//    lazy var nameText = Player(context: context)
//    var playerInfo = [Player]()
lazy var player = [Player]()
let playerData = PlayerData()
var name = ""


@IBOutlet weak var playerName: UILabel!

@IBOutlet weak var currentLevel: UILabel!

@IBOutlet weak var xpCounter: UILabel!

@IBOutlet weak var playerProfileImage: UIImageView!



override func viewDidLoad() {
    super.viewDidLoad()

//        loadItems()
//        name = playerData.name
    if let nameOfPlayer = name.name {
        print("This is what we see: \(nameOfPlayer)")
    playerName.text = nameOfPlayer
    }
    appDelegate.saveContext()

}

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
//        loadView()

}

@IBAction func menuButtonPressed(_ sender: Any) {

}

func loadItems() {
    let request = Player.fetchRequest() as NSFetchRequest<Player>
    do {
        player = try context.fetch(request)
        print("Info loaded")
    } catch {
        print("Error fetching data from context \(error)")
    }
}
// MARK : Add Name to Main View


// MARK : Add Xp To Main View

// MARK : Add UI Image to profile image view

// MARK:  (Optional) Create a 'Choose a task button to segue to the task tab'


// MARK: Program the Progress Bar to update on xp gained and reset on level up


// MARK: Function to Save and Load data??
}

如果需要数据源代码,我会根据要求添加。

谢谢!

标签: iosswift

解决方案


代码错误。你应该做更多检查

图片


推荐阅读