在 xib 中定义的 SubView 中定义的 TableView 中未调用 didSelectRowAtIndexPath

Posted

技术标签:

【中文标题】在 xib 中定义的 SubView 中定义的 TableView 中未调用 didSelectRowAtIndexPath【英文标题】:didSelectRowAtIndexPath not called in TableView defined in SubView defined in xib 【发布时间】: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。你能用你的代码展示你是如何显示这个视图的吗? 【参考方案1】:

我只是将您的代码添加到一个虚拟项目中进行检查。我这样做是为了你的方法

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 连接了任何委托和数据源。总而言之,您的代码看起来不错,我能够正确单击它。以下是我取得的成果。

【讨论】:

谢谢。如您所述,我尝试以编程方式将其添加到 UIViewController 中,然后它是可点击的(即使使用 xib 和 tableview 设置)。我试图通过情节提要添加它(带有自定义类 SubUnitSpinner 的 UIView)。不能那样做吗?似乎在情节提要中进行所有布局会更容易。 啊。仅编写两行代码比从情节提要中编写要容易得多。此外,如果您确实想从情节提要中执行此操作,我认为没有必要创建自定义视图。只需从对象中拖动 UIView 并使用插座创建您的视图。无论如何,很高兴它奏效了。如果您能接受我的回答,那就太好了。 :) 我想在应用程序的不同部分使用这个视图。这就是为什么我认为拥有自定义视图会更好。如果故事板方式不值得,我想我会这样做。知道使用情节提要有什么不同吗? 如果你想在多个视图中实现它,那么最好有一个可重用的自定义视图,我看到你已经想到了。 Storyboard 和 xib 基本相似,都用于设计视图。所以对于你必须使用什么没有硬性规定。但是您可以在其中一个故事板而不是 xib 文件中为此视图创建一个 UIViewcontroller,并在其他视图中显示该 UIViewcontroller。这样做会减少您自定义视图中的初始化和设置代码,以及当您可以如此轻松地实现某些目标时为什么还要努力工作。 感谢您的提示和所有帮助。那我试试看。

以上是关于在 xib 中定义的 SubView 中定义的 TableView 中未调用 didSelectRowAtIndexPath的主要内容,如果未能解决你的问题,请参考以下文章

如何在另一个 ViewController 中将带有 Xib 的 ViewController 显示为 SubView

iOS 那些遇到的问题

从 XIB 中重构控件和功能的最佳实践

将 Subview 传递给子类 UIView

UIStackView:从xib加载视图和更新subView的高度约束没有反映任何变化?

如何用户 XIB 使 SuperView 匹配 Subview 的框架? (Xcode 8)