tableView:didSelectRowAtIndexPath未在自定义视图中调用

时间:2015-07-16 07:29:00

标签: ios swift uitableview

我做了popupView来选择项目中的某个对象。

除了tableViewDelegate没有被调用外,一切正常。(DataSource工作正常)

我从tableView.delegate记录了cellForRowAtIndexPath的值。它也有正确的值。

以下是我的代码。

protocol AddressSelectPopupDelegate: NSObjectProtocol {

func addressSelectPopup(selectedContact: Contact) }

class AddressSelectPopupView: UIView, UITableViewDelegate, UITableViewDataSource {

@IBOutlet weak var tableView: UITableView!

weak var parentView: UIView!
weak var delegate: AddressSelectPopupDelegate!


var contactList : [Contact] = []
var selectedContact : Contact?


class func addressSelectPopupView(parentView: UIView, delegate: AddressSelectPopupDelegate) -> AddressSelectPopupView
{
    var popupView = UINib(nibName: "AddressSelectPopupView", bundle: NSBundle.mainBundle()).instantiateWithOwner(nil, options: nil)[0] as! AddressSelectPopupView
    popupView.parentView = parentView
    popupView.delegate = delegate

    popupView.tableView.registerNib(UINib(nibName: "AddressInfoTableViewCell", bundle: NSBundle.mainBundle()), forCellReuseIdentifier:"AddressInfoTableViewCell")
    popupView.tableView.delegate = popupView
    popupView.tableView.dataSource = popupView

    return popupView
}

//MARK: - Public Interface
func popup()
{
    self.parentView.addSubview(self)

    self.loadContactList()
}

func dismiss()
{
    self.removeFromSuperview()
}

//MARK: - Private Interface
private func loadContactList()
{
    ConnectionManager.connection.loadContactList({ [weak self](contactList) -> Void in

        self!.contactList = contactList

        dispatch_async(dispatch_get_main_queue(), { () -> Void in
            if self!.tableView != nil
            {
                self!.tableView.reloadData()
            }

        })

    }, failure: { [weak self] () -> Void in
        self!.tableView.reloadData()
    })
}

//MARK: - UITableView Delegate & DataSource
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return contactList.count
}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    var cell:AddressInfoTableViewCell = tableView.dequeueReusableCellWithIdentifier("AddressInfoTableViewCell") as! AddressInfoTableViewCell

    let contact = contactList[indexPath.row]

    cell.contact = contact

    return cell
}

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

    selectedContact = contactList[indexPath.row]

}

func tableView(tableView: UITableView, willSelectRowAtIndexPath indexPath: NSIndexPath) -> NSIndexPath? {

    selectedContact = contactList[indexPath.row]

    return indexPath
}



@IBAction func cancelAction(sender: AnyObject) {
    self.dismiss()
}

@IBAction func confirmAction(sender: AnyObject) {
    //TODO : add confirmAction

    if selectedContact != nil
    {
        self.dismiss()
        if delegate.respondsToSelector(Selector("addressSelectPopup:"))
        {
            delegate.addressSelectPopup(selectedContact!)
        }
    }
}}

///更新1

我使用Delegate& amp;创建一个新的ViewController(称为PopupVC)。上面的DataSource代码。

Way1:我从rootView呈现PopupVC。

结果:它运作正常。

Way2:我将PopupVC视图作为子视图添加到rootView,并将PopupVC作为childViewController添加到rootView。

结果:滑动单元格将调用didSelectRowAtIndexPath。点击只会突出显示单元格。

///更新2

我刚注意到rootView是由另一个View提供的。

3 个答案:

答案 0 :(得分:2)

在调用 popoverview 之前,首先删除子视图的点按手势。然后只在popoverview中调用UITableViewDelegate。 要从您的视图中删除手势,请使用以下代码:

self.view.gestureRecognizers?.forEach(self.view.removeGestureRecognizer(_:))
self.view.addSubview(self.customView.view)

答案 1 :(得分:0)

将此添加到您的班级:

required init(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    tableView.delegate = self
    tableView.dataSource = self
}

答案 2 :(得分:0)

您不应该在界面构建器和编程方式中连接委托和数据源。 我相信一个人设置不好而且正在干扰另一个人。

您可以尝试删除界面构建器中的链接,检查发生了什么,如果它不起作用,请再次添加它们,但删除代码中的链接。