2017-02-19 134 views
0

我不知道如何从我的视图模型视图中的数据传递给我的看法,最后显示的数据,我的视图模型类:如何从视图模型层将数据传递给视图层

class MainViewModel { 

    let sessionController: SessionController 
    weak var mainViewCoordinator: MainViewCoordinator? 
    public var fakeUsers: [User]? 

    init(sessionController: SessionController = SessionController()) { 
     self.sessionController = sessionController 
    } 

    func viewDidLoad() { 
     Service.instance.execute(resource: User.fake) { (result) in 
      print("\n result \(result)\n") 
      self.fakeUsers = result.value 
     } 
    } 
} 

我使用的Unbox夫特JSON解码器,以及打印结果是是和用户的对象数组是这样的:

([ 
    User(id: "5851ac2615801e2348e4ea07", 
     birthDate: "2016-09-17T07:22:09.985Z", 
     msisdn: "912 065 979", 
     email: "[email protected]", 
     profileImageUrl: "https://s3.amazonaws.com/...", 
     repPoints: 41607, 
     created: "2016-12-14T20:31:34.185Z", 
     displayName: "Victoria Escobedo"), 
    User(id: "5851ac2615801e2348e4ea09", 
     birthDate: "2016-05-06T11:38:23.678Z", 
     msisdn: "958842030", 
     email: "[email protected]", 
     profileImageUrl: "https://s3.amazonaws.com/...", 
     repPoints: 71408, 
     created: "2016-12-14T20:31:34.198Z", 
     displayName: "Gonzalo Rascón"), 
    User(id: "5851ac2615801e2348e4ea08", 
     birthDate: "2016-05-29T18:12:32.423Z", 
     msisdn: "905534639", 
     email: "[email protected]", 
     profileImageUrl: "https://s3.amazonaws.com/...", 
     repPoints: 24164, 
     created: "2016-12-14T20:31:34.195Z", 
     displayName: "Ramiro Dueñas"), 
    ... 
]) 

我想的结果传递给查看层(MainViewController)来显示每个用户在表视单元格中:

类MainViewController:UIViewController中,UITableViewDataSource {

@IBOutlet var tableview:UITableView! 
var viewModel: MainViewModel = MainViewModel() 

override func viewDidLoad() { 
    super.viewDidLoad() 
    viewModel.viewDidLoad() 
    self.tableview?.reloadData() 
    self.navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Action", style: .plain, target: self, action: #selector(action)) 
} 

func action() { 
    viewModel.userDidSelectItem(identifier: "xxxx") 
} 

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return viewModel.fakeUsers?.count ?? 0 
} 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) ->UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "fakeUserObjectCell") as! MainTableViewCell 
    cell.fakeUserObject = viewModel.fakeUsers?[(indexPath as NSIndexPath).row] 
    return cell 
} 

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if segue.identifier == "detailSegue" { 
     let detailMainViewController = segue.destination as! DetailMainViewController 
     if let indexPath = tableview.indexPath(for: sender as! MainTableViewCell) { 
      detailMainViewController.id = viewModel.fakeUsers?[(indexPath as NSIndexPath).row].id 
     } 
    } 
} 

}

我知道我必须实现self.tableview?.reloadData()展现fakeusers,但我不知道如何来传递数据,最后证明这一点。

回答

1

的以下Service.instance.execute()viewModel.viewDidLoad()是一个异步调用。它没有完成抓取,因此您打电话self.tableview?.reloadData()因此,这可能导致0行。

我建议改变ViewModelviewDidLoad()来完成呼叫

func viewDidLoad() { 
    Service.instance.execute(resource: User.fake) { (result) in 
     print("\n result \(result)\n") 
     self.fakeUsers = result.value 
    } 
} 

像这样:

func loadUsers(completion:() ->()) { 
    Service.instance.execute(resource: User.fake) { (result) in 
     print("\n result \(result)\n") 
     self.fakeUsers = result.value 
     completion() 
    } 
} 

因此在MainViewControllerviewDidLoad,你可以准备好当调用更改为只reloadData()

override func viewDidLoad() { 
    super.viewDidLoad() 
    viewModel.loadUsers { 
     self.tableview?.reloadData() 
    } 
    self.navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Action", style: .plain, target: self, action: #selector(action)) 
} 
0
  • MainViewModel的声明一个公共变种public var fakeUsers: [User]?MainViewModel
  • 更新fakeUsersviewDidLoad()
  • MainViewController
  • numberOfRowsInSectionMainViewController不需要一个fakeUsers VAR现在返回fakeUsersMainViewModel像设置计数:


func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return viewModel.fakeUsers?.count ?? 0 
} 

同样,对于cellForRowAt indexPath:

编辑:

Service.instance.execute API调用不会立即返回,但如果这样做,数据数组应该用新的更新内容&请求刷新表格。
但现在的问题是我们不能在MainViewModel中有table访问权限。
所以,当Service取完成,我们可以notifyMainViewController执行table.reloadData()
我希望你能拿出该位的代码,你需要从这里开始:

class MainViewModel { 
    ... 

    func viewDidLoad() { 
     Service.instance.execute(resource: User.fake) { (result) in 
      print("\n result \(result)\n") 
      self.fakeUsers = result.value 
      // Edu, the table refresh notification is to be fired from here 
     } 
    } 
} 
+0

我刚才编辑的代码,但我忘了什么东西,因为这个问题仍然存在 – Edu

+0

@Edu是的,我们错过了在第一流的组件,检查编辑。 – ystack

相关问题