我一直在尝试创建一个通过xib加载的自定义视图,其中包含一个按钮和tableview。按下按钮时会显示或隐藏表格视图。 此交互有效,并且创建/显示表。我遇到的问题是我无法点击表格行。 我一直在寻找,并没有找到一个有效的解决方案。 我确保设置了delegate和dataSource。我也没有用于ViewController的GestureRecognizer,因为它可以吸收触摸。
有人知道我错过了什么吗?
以下是此自定义视图的代码:
class SubUnitSpinner : UIView, UITableViewDataSource, UITableViewDelegate {
@IBOutlet weak var spinnerTableView: UITableView!
let subUnitNames: [String] = ["World", "Add/Remove"]
override init( frame: CGRect ) {
super.init(frame: frame)
loadViewFromNib()
setupTableView()
}
required init?( coder aDecoder: NSCoder ) {
super.init(coder: aDecoder)
loadViewFromNib()
setupTableView()
}
func setupTableView() {
spinnerTableView.delegate = self
spinnerTableView.dataSource = self
spinnerTableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "Cell")
spinnerTableView.rowHeight = 30
spinnerTableView.userInteractionEnabled = true
spinnerTableView.allowsSelection = true
spinnerTableView.hidden = true
}
func loadViewFromNib() {
let bundle = NSBundle(forClass: self.dynamicType)
let nib = UINib(nibName: "SubUnitSpinner", bundle: bundle)
let xibView = nib.instantiateWithOwner(self, options: nil)[0] as! UIView
xibView.frame = bounds
xibView.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]
self.addSubview(xibView)
}
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 2
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = spinnerTableView.dequeueReusableCellWithIdentifier("Cell")! as UITableViewCell;
cell.userInteractionEnabled = true
cell.textLabel?.text = subUnitNames[indexPath.row]
cell.tag = indexPath.row
return cell;
}
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
//Interaction
print("cell with path: \(indexPath.row)")
}
@IBAction func spinnerTabbed(sender: AnyObject) {
spinnerTableView.hidden = !spinnerTableView.hidden
} }
更新
查看布局创建:
xib视图布局已在“storyboard”中定义,文件所有者设置为SubUnitSpinner。 IBOutlet和IBAction由ctrl拖放创建。
UIViewController中的用法:
我将它用作UIViewController的一部分,它也已在故事板中定义。我添加了一个UIView,并将Custom Class声明为SubUnitSpinner。 具有xib中定义的布局的SubUnitSpinner在运行时显示,并且按钮可单击,显示按钮时显示/隐藏UITableView。唯一不起作用的是点击tableView单元格。
设置有问题吗?
答案 0 :(得分:0)
我刚拿了你的代码并添加到一个虚拟项目来检查。我为你的方法做了这个
required init?( coder aDecoder: NSCoder ) {
super.init(coder: aDecoder)
// removed the load from nib and setup tableview
}
在我的情况下,我执行了以下操作将SubUnitSpinner
视图添加到父视图中。希望你做同样的事情
let aTestView = SubUnitSpinner(frame: CGRectMake(50, 200, 200, 200))
view.addSubview(aTestView)
同时仔细检查您是否已连接xib中的任何委托和数据源。总而言之,您的代码看起来很好,我能够正确地点击它。以下是我取得的成绩。