【问题标题】:display the data from UIView to UIViewController将数据从 UIView 显示到 UIViewController
【发布时间】:2018-09-14 19:15:42
【问题描述】:

我需要在 UIView 中显示数据。我创建了一个类名:- MYView-UIView

  import UIKit

    class MYView: UIView {
        @IBOutlet weak var name: UILabel!

        override func awakeFromNib() {
            super.awakeFromNib()
        }

 func setlisttabData(chefs:listModel)
   {
        self.name.text = chefs.name
    }

    }

我的视图控制器为:-

import UIKit

class listViewController: UIViewController {
    //  @IBOutlet private weak var tableView: UITableView!

    @IBOutlet var chef: MYView!

    private var listViewModel :ListViewModel!

    init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?, withViewModel viewModel:ListViewModel) {
        super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
        listViewModel  = viewModel
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override func viewDidLoad() {
        super.viewDidLoad()
    }
}

在此我没有使用主情节提要。 所以对于listViewController 我有.xib

在 xib 中,我在其中放置了滚动视图和一个视图。在视图中,我将类名命名为 MYView。然后我在里面放了一个标签。并给出连接。

现在我需要显示名称。如何操作。

我在 UIView 中给出了一个函数:

func setlisttabData(chefs:listModel){
    self.name.text = chefs.name
}   

模型类:- 导入 UIKit

class listModel: NSObject {



    var name:String!

    init?(dictionary :JSONDictionary) {

        guard let name = dictionary["name"] as? String else {
                return
        }

        self.name = name
      }  
    }

 my listviewmodel:-


class listviewmodel: NSObject {



    var datasourceModel:listDataModel

    init(withdatasource  newDatasourceModel: listDataModel) {
        datasourceModel = newDatasourceModel
    }


    func datafordisplay(atindex indexPath: IndexPath) -> listModel{
        return  datasourceModel.dataListArray![indexPath.row]

    }


    func numberOfRowsInSection(section:Int) -> Int {

        return (datasourceModel.dataListArray?.count)!
    }


}

和listdatasourcemodel:-

class listDataModel: NSObject {


    var dataListArray:Array<listModel>? = []


    init(array :Array<[String:Any]>?) {
        super.init()
        var newArray:Array<[String:Any]> = []
        if array == nil{

            newArray = self.getJsonDataStored3()
        }
        else{
            newArray = array!

        }

        var datalist:Array<listModel> = []
        for dict in newArray{

            let model = listModel(dictionary: dict)

            datalist.append(model!)
        }
        self.dataListArray = datalist
    }



}

typealias dummyDataSource3 =  listDataModel
extension dummyDataSource3{

    func getJsonDataStored3() ->Array<Dictionary<String,String>>{

        let jsonArray = [["name":"Anjapar"] as Array<Dictionary<String,String>>

        return jsonArray
    }





}

我得到了模型中的值。但我认为下面这个函数需要改变一些东西。

 func datafordisplay(atindex indexPath: IndexPath) -> listModel{
            return  datasourceModel.dataListArray![indexPath.row]

        }

我需要从该 jsondictionary 中获取名称。

那么,如何在 ViewController 中调用。这是在 mvvm 方法中完成的。

【问题讨论】:

  • 错误是什么?
  • @PPL 我没有得到名称。如何在视图控制器中调用函数 setlisttabData
  • 你得到厨师 IBOutlet 了吗?请检查名称不为零
  • @PPL 我已经更新了我的代码。请检查。我已经在 MYView 类中给出了 func setlistData
  • 您是从 datafordisplay 获取 listmodel 吗?或者在这个方法中,setlisttabData,检查 listmodel 的名字不是 nil

标签: ios swift mvvm


【解决方案1】:

您可以使用委托来实现这一点。
1. 创建具有函数声明的协议。
2、通过协议扩展viewController类实现viewController中的功能。
3.在UIView类中引用协议。

weak  var delegate: YourProtocol?
  1. 在viewController中设置UIView委托

    view.delegate = self
    
  2. 在您想要的UIView 类中调用委托函数。这将调用 UIViewController 协议函数。

为了更好地理解delegation,可以阅读this

【讨论】:

    【解决方案2】:

    你可以这样称呼它:

    self.chef.setlisttabData(listViewModel.datasourceModel.dataListArray)
    

    【讨论】:

    • 建筑师从哪里来
    • 但此处显示错误为:- 无法将 'Array 的类型转换为预期的参数类型 'listmodel'
    • 我需要调用func datafordisplay方法,怎么做
    猜你喜欢
    • 1970-01-01
    • 2010-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-14
    • 2012-06-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多