自定义UIView委托

时间:2018-08-08 16:21:42

标签: ios swift

我是Swift和ios开发的新手。我正在创建一个UIView,它由一个tableView组成,我将使用它来显示供用户选择的信息,类似于选择器,但它是一个tableView,它占用了全屏。

class SelectView: UIView, UITableViewDataSource, UITableViewDelegate {

    @IBOutlet weak var tableView: UITableView!
    @IBOutlet var contentView: UIView!

    override init(frame: CGRect) {
        super.init(frame: frame)
        commonInit()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        commonInit()
    }

    private func commonInit(){
        Bundle.main.loadNibNamed("SelectView", owner: self, options: nil)
        //contentView.frame = self.bounds
        //contentView.autoresizingMask = [.flexibleHeight,.flexibleWidth]
        tableView.dataSource = self
        tableView.delegate = self
        self.addSubview(self.tableView)
    }



    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 10
    }


    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
//        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
        let cell = UITableViewCell()
        print("cell ", String(indexPath.row))
        cell.textLabel?.text = "test"
        return cell
    }
}

然后在另一个我正在尝试做的课中

let pickerView = SelectView()
pickerView.delegate = self
pickerView.datasource = self
textfield.inputView = pickerView

我认为这应该可以工作,但是可以覆盖SelectView中的默认值,但是出现此错误。

类型'SelectView'的值没有成员'delegate',并且无法分配给属性:'inputView'是只能获取的属性。

不确定这里发生了什么,但是似乎我已经委派了安全措施,然后只是告诉带有文本字段的类来委派。

3 个答案:

答案 0 :(得分:1)

以这种方式检查

import UIKit
public protocol menuOpen:  class {
    func openMenuAction(selectedValue : String)
}

class SelectView: UIView {
    open var delegate:menuOpen?
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        self.delegate.openMenuAction("test")
    }

}

现在在另一个班上

确保在另一堂课中确认您的协议

class HomeViewController: UIViewController,menuOpen{

 override func viewWillAppear(_ animated: Bool) {
   let pickerView = SelectView()
    pickerView.delegate = self
    textfield.inputView = pickerView
}


func openMenuAction(selectedValue : String) {
//get your selected value here, you would better pass parameter in this method
}

    }

答案 1 :(得分:0)

您要为tableView而不是SelectView设置委托和数据源

pickerView.tableView.delegate = self
pickerView.tableView.datasource = self

答案 2 :(得分:0)

  

“ SelectView”类型的值没有成员“ delegate”,并且无法分配给属性:“ inputView”是仅获取属性。

问题是SelectView没有这些属性,拥有它们的是tableView,可以按以下方式委派对这些属性的访问

class SelectView: UIView {

    @IBOutlet weak var tableView: UITableView!
    @IBOutlet var contentView: UIView!

    var delegate: UITableViewDelegate? {
        get { return tableView.delegate }
        set { tableView.delegate = newValue}

    }

    var datasource: UITableViewDataSource? {
        get { return tableView.dataSource }
        set { tableView.dataSource = newValue}
    }
   ....
}

使用

    let pickerView = SelectView()
    pickerView.delegate = self

如果您不想,也可以直接访问表格视图

let pickerView = SelectView()
pickerView.tableView.delegate = self
pickerView.tableView.datasource = self