ios - 将 UIView 中的数据显示到 UIViewController

标签 ios swift mvvm

我需要在 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
    }

    }

我的 View Controller 为:-

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()
    }
}

在此我没有使用主 Storyboard。 所以对于 listViewController 我有 .xib

在 xib 中,我在其中放置了 ScrollView 和 View 。在 View 中,我将类名称指定为 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)!
    }


}

和列表数据源模型:-

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 方法中完成的。

最佳答案

您可以使用委托(delegate)来实现此目的。
1. 创建一个具有函数声明的协议(protocol)。
2、通过协议(protocol)扩展viewController类来实现viewController中的功能。
3. 在UIView类中获取协议(protocol)的引用。

weak  var delegate: YourProtocol?
  • 在viewController中设置UIView委托(delegate)

    view.delegate = self
    
  • 在您想要的位置调用 UIView 类中的委托(delegate)函数。这将调用 UIViewController 协议(protocol)函数。

  • 为了更好地理解委托(delegate),您可以阅读this

    关于ios - 将 UIView 中的数据显示到 UIViewController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49664340/

    相关文章:

    c# - 如何在 DataContext 略有不同的情况下重用 UserControl?

    wpf - 在WPF中使用MVVM,我应该从后面的View代码或ViewModel启动子窗口吗?

    swift - 在 UITextView 中放置附加文本 - WhatsApp 时间戳副本

    ios - 将表格 View 单元格中收藏夹按钮的状态保存在 NSUserDefaults 中

    swift - 如何在 Swift 中将 masterTableView 与DetailView 链接在一起

    ios - 二元运算符 '<<' 不能应用于两个 'T' 操作数

    javascript - 剑道用户界面 : Not able to add footerTemplate to grid

    ios - 类型 'x' 的值没有成员“小写”

    iPhone/iPad/iPod机型版本

    iOS 翻译 API 给出的文本