0

首先,让我解释一下我的应用程序及其流程。应用程序打开,用户创建一个配置文件(将所有数据存储在类型的字典中[String: Any])。用户单击创建后,它将它们发送到控制台屏幕(显示用户输入的部分信息,例如通过 a 显示的姓名segue)。有一个选项卡可以让他们编辑他们的个人资料(姓名、体重、地址等)。当用户编辑他们的信息(更改他们的姓名、体重等)时,它还应该更新控制台页面上显示的信息。

我的主要问题是,如何构建它以便数据对所有选项卡视图都可用。更具体地说,因此数据不是数据的实例或副本。我创建了一个名为的类Person,其中存储了所有变量(firstName,lastName等)。我尝试在类声明之前将 person 类的实例声明为变量UIViewController,但它不会让我使用该UITextField .text属性(因为它们还没有被创建......?)。

这是我的 Person 类...

class Person {

    var firstName: String
    var lastName: String
    var phoneNumber: String
    var weight: Int
    var gender: String
    var streetAddress: String
    var cityState: String

    init(firstName: String, lastName: String, phoneNumber: String, weight: Int, gender: String, streetAddress: String, cityState: String) {
        self.firstName = firstName
        self.lastName = lastName
        self.phoneNumber = phoneNumber
        self.weight = weight
        self.gender = gender
        self.streetAddress = streetAddress
        self.cityState = cityState
    }
}

我还对 as 进行了子类化UITabBarControllerTabBarViewController因为我读过您可以将数据发送到该子类viewController,并使其对所有嵌入的选项卡普遍可用。我只是不知道这一切是如何运作的。

对于可能提出重复问题,我深表歉意......我已经查看/研究了这个,但我没有找到任何适合我的特定案例的解决方案。

更新代码以将数据另存为CoreData...

    guard let appDelegate =
        UIApplication.shared.delegate as? AppDelegate else {
            return
    }
    let managedContext = appDelegate.persistentContainer.viewContext
let userInfo = PInfo(firstName: firstNameField.text, lastName: lastNameField.text, cityState: cityStateField.text, streetAddress: streetAddressField.text, gender: genderInputField.text, userWeight: 200)

save(withPersonInfo: userInfo, withContext: managedContext)

我可以访问各种数据viewControllers,但它会将它作为单个项目数组返回给我......理想情况下,我希望将它们key:value成对放置,以便我可以轻松地将它们设置为显示并且可以在Edit Profile viewController.

谢谢!

4

2 回答 2

1

一个非常简单的解决方案是为您的应用程序委托提供一个person初始化为空 Person 的属性。这解决了这个问题,因为每个类都可以访问该属性:

let p = (UIApplication.shared.delegate as! AppDelegate).person

此外,p通过引用获取此 Person ,因此对其属性的任何更改都会反映回person属性本身,以供下一个视图控制器查看(和变异)。

由于只需要配置一个用户,因此更复杂、更令人满意的解决方案是让 Person 类本身将sharedperson 实例分配为单例。(搜索 SO 以了解如何在 Swift 中实现单例。)同样,单例将普遍可用:

let p = Person.shared()
于 2017-04-21T01:49:08.737 回答
0

一种解决方案是Delegates. 您获取数据的类将设置您的委托,并且希望获得该委托的任何其他人都订阅该委托。

事实上:我认为使用 Delegate + CoreData可能会使您免于麻烦;侦听数据然后保存该数据。现在您的其他控制器将为该用户场景进行快速获取(核心数据是如此之快:)

一些代码:

class PersonDetail: NSManagedObject { // this is how your coreData's Entity should look like 
    @NSManaged public var firstname: String?
    @NSManaged public var lastname:  String?

    // add the other fields, such as weight 

    @nonobjc public class func fetchRequest() -> NSFetchRequest<PersonDetail> {
        return NSFetchRequest<PersonDetail>(entityName: "PersonDetail")
    }
}
// This struct would to get the data from the user 
struct PInfo {
    var firstname:String?
    var lastname:String?
}
// this function would get an instance of that PInfo 
// for example var p = PInfo(firstname:"Stack",lastname:"Overflow")

func save(withPersonInfo p:PInfo, withContext context:NSManagedObjectContext) {
    let entityDescription = NSEntityDescription.entity(forEntityName: "PersonDetail", in: context)
    let managedObject = NSManagedObject(entity: entityDescription!, insertInto: context) as! PersonDetail
    // this is where I am passing data into the entity 
    managedObject.firstname = p.firstname
    managedObject.lastname = p.lastname

    try? context.save() // use the proper do {} catch, I was saving time lol :)

}
// when you fetch from coreData you have an instance of PInfo

func fetchSingleUser(withContext context:NSManagedObjectContext) -> PInfo {
    let request:NSFetchRequest<PersonDetail> = PersonDetail.fetchRequest()
    let coreData_items = try? context.fetch(request)

   guard let items = coreData_items,
       let firstItem = items.first  // since we only have one user
       else {  fatalError("Error while querying")  }

    return PInfo(firstname: firstItem.firstname, lastname:firstItem.lastname)
}
于 2017-04-21T01:44:15.540 回答