我是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
'是只能获取的属性。
不确定这里发生了什么,但是似乎我已经委派了安全措施,然后只是告诉带有文本字段的类来委派。
答案 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