我做了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提供的。
答案 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)
您不应该在界面构建器和编程方式中连接委托和数据源。 我相信一个人设置不好而且正在干扰另一个人。
您可以尝试删除界面构建器中的链接,检查发生了什么,如果它不起作用,请再次添加它们,但删除代码中的链接。