【发布时间】:2016-07-11 02:51:53
【问题描述】:
我一直在尝试创建一个通过 xib 加载的自定义视图,其中包含一个按钮和表格视图。按下按钮时显示或隐藏表格视图。 这种交互有效并且表格被创建/显示。我遇到的问题是我无法单击表格行。 我一直在寻找,并没有找到有效的解决方案。 我确保已设置委托和数据源。我也没有用于 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 视图布局,并将文件所有者设置为 SubUnitSpinner。通过 ctrl 拖放创建的 IBOutlet 和 IBAction。
在 UIViewController 中的使用:
我将它用作 UIViewController 的一部分,该 UIViewController 也已在情节提要中定义。我添加了一个 UIView 并将自定义类声明为 SubUnitSpinner。 具有 xib 中定义的布局的 SubUnitSpinner 在运行时显示并且按钮是可点击的,当按钮显示时 UITableView 显示/隐藏。唯一不起作用的是单击 tableView 单元格。
设置有问题吗?
【问题讨论】:
-
尝试将 xibView (let xibView = nib.instantiateWithOwner(self, options: nil)[0] as!UIView) 作为全局变量,并保留它(不允许 ARC 解除分配)。跨度>
-
@RJE 感谢您的建议。遗憾的是,这并没有奏效。
-
视图是否启用了用户交互?我可以看到你为 UITableView 启用了它,但是容器视图本身呢?
-
@ManjulShrestha 是的,它是从相应的 UIViewControl 启用的。我也只是在课堂上添加了它,没有任何变化。
-
当您将 SubUnitSpinner 类为 UIView 的子类而不是 UIViewController 时,您如何能够创建 IBOutlet。你能用你的代码展示你是如何显示这个视图的吗?
标签: ios swift uitableview xib