【问题标题】:How to get Mappable model class data in another ViewController in swift 3如何在 swift 3 中的另一个 ViewController 中获取 Mappable 模型类数据
【发布时间】:2017-08-15 06:35:50
【问题描述】:

我有一个 Mappable 类型的模型类,我在 firstViewController 中从 api 传递数据。现在我想访问 secondViewController 中的模型类数据。那么我如何使用 secondViewController 中的数据。 这是我的代码:

import ObjectMapper

class UserProfileResponse: Mappable {

var data:UserProfileData?
var success: Bool?
var error: String?

required init?(map: Map){

}

func mapping(map: Map) {
    data <- map["data"]
    success <- map["success"]
    error <- map["error"]
}
}

class UserProfileData: Mappable {

var address: String?
var joinDate: String?
var phone: String?
var policyName: String?
var imageUrl: String?
var name: String?
var policyNo: String?
var title: String?

required init(map: Map){

}

func mapping(map: Map) {
    address <- map["address"]
    joinDate <- map["joinDate"]
    phone <- map["phone"]
    policyName <- map["policyName"]
    imageUrl <- map["imageUrl"]
    name <- map["name"]
    policyNo <- map["policyNo"]
    title <- map["title"]
}

}

我的 FirstViewController 从我将数据发送到此模型类的位置

 func getUserProfileDataFromApi(){
    //Calling the method from Api class
    userProfileApi{completion in self.getProfileData(result: completion)}
}

func userProfileApi(completion:@escaping (_ result:UserProfileData)->()) {
let defaultObject = UserDefaults.standard
let headerToken = defaultObject.object(forKey: KHeaderToken) as! String
let headers = ["Authorization": headerToken]

Alamofire.request(KProfileUrl, method: .post, encoding: JSONEncoding.default, headers: headers)
    .validate()
    .responseObject{ (response: DataResponse<UserProfileResponse>) in
        switch response.result{
        case .success:
            let value = response.result.value
            completion((value?.data)!)
        case .failure(let error):
            print(error.localizedDescription)
        }
}
}
func getProfileData(result: UserProfileData){
   // Here i get all data in firstViewController
}

Now how i can get the UserProfileData in secondViewController. 

【问题讨论】:

  • @ASP 谢谢我知道,但我不是从第一个导航到第二个,反之亦然。实际上,从菜单中选择选项后会打开 secndVc 视图。所以它不在导航 viewControllers 堆栈中。所以我需要的是如何创建 UserProfileData 对象并使用它。

标签: swift3 objectmapper


【解决方案1】:

创建一个 Signleton 类,您可以在其中从 API 响应中填充您的 UserProfileData。

class UserProfileManager {
    static var userProfile: UserProfileData?

 private static var sharedManager: UserProfileManager = {
        let shared = UserProfileManager()
        return shared
    }()

    class func shared() -> UserProfileManager {
        return sharedManager
    }
}

您可以从此单例访问 userProfileData,但这仅在您退出并启动时才在第一次保留,它不会在那里将您的信息存储在 UserDefaults 中。

【讨论】:

  • Santosh 我如何处理此类中的空值的另一件事。我对“policyNo”的响应为空。
  • Mappable 如果为 nil,则返回 nil。如果你想用一些默认值处理 nil,你可以这样做 if let policyNum = map.JSON["policyNum"]{// 如果不是 nil 则赋值}
【解决方案2】:

如果您使用 segue 从 firstViewController 显示 secondViewController,那么您可以使用 prepare segue 来传递数据。

    override func prepare(for segue: UIStoryboardSegue, sender _: Any?) {
            let destinationViewController = segue.destination as! SecondViewController
 destinationViewController.userProfileData = self.userProfileData
}

那么你的 secondViewController 将像这样,加上你的实现。

class SecondViewController{

var userProfileData:UserProfileData?
}

【讨论】:

  • 不,兄弟,实际上我想创建 UserProfileData 的对象,然后我想使用从 API reposnse 获得的存储在该类中的值。您给出的解决方案对于传递数据 b/w 2 控制器是正确的。
猜你喜欢
  • 2014-02-13
  • 2018-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-01
  • 1970-01-01
相关资源
最近更新 更多