swift:表视图单元格中的按钮上的弹出窗口始终显示在第一个单元格上

时间:2016-05-17 02:58:40

标签: ios swift uitableview uipopovercontroller

我在Swift中创建一个表格视图,每个单元格都包含一个按钮。 点击按钮时,该按钮上会显示一个弹出窗口。

我的问题是,无论我在哪个单元格中单击按钮,弹出框始终显示在第一个单元格上。

请参阅附图以了解更多信息。

table popover

下面是tableviewcontroller类中的代码。我使用标签来检测触摸按钮。

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        // Table view cells are reused and should be dequeued using a cell identifier.
        let cellIdentifier = "Cell01"
        let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as? UICell01
        //when tap share button
        cell!.shareButton.tag = indexPath.row
        cell!.shareButton.addTarget(self, action: "shareAction:", forControlEvents: .TouchUpInside)    
        return cell!
    }






    @IBAction func shareAction(sender: UIButton)    {
        //Create Action Sheet to be menu
        let alert:UIAlertController = UIAlertController(title: "Share on", message: nil, preferredStyle: UIAlertControllerStyle.ActionSheet)
        let cancelAction = UIAlertAction(title: "Cancel", style: UIAlertActionStyle.Cancel)
        {
            UIAlertAction in
        }
        // Add the actions
        alert.addAction(cancelAction)

        // Present the controller
        if UIDevice.currentDevice().userInterfaceIdiom == .Phone
        {
            self.presentViewController(alert, animated: true, completion: nil)
        }
        else    //iPad
        {
             var popover:UIPopoverController?=nil
            popover = UIPopoverController(contentViewController: alert)
            popover!.presentPopoverFromRect(sender.frame, inView: self.view, permittedArrowDirections: UIPopoverArrowDirection.Any, animated: true)
        }

我认为问题出在最后一行。传递给function的“sender”只是第一个单元格中的按钮。我该如何解决这个问题?

4 个答案:

答案 0 :(得分:0)

您引用sender.frame相对于其自己的单元格,而不是相对于UITableView合并单元格的框架。检查发件人的superview

答案 1 :(得分:0)

尝试在客户UITableViewCell类中声明shareAction并将其分配给单元格。如下所示

server

答案 2 :(得分:0)

感谢所有人的启发。

我可以通过将最后一行改为

来解决
popover!.presentPopoverFromRect(sender.frame, inView: sender.superview!, permittedArrowDirections: UIPopoverArrowDirection.Any, animated: true)

现在弹出气球显示在我触摸的正确按钮上。

但我仍然不太了解inView参数。

如果是self.view,弹出气球将显示在第一个单元格上。 如果是sender.superview,则弹出框气球显示在正确的单元格上。

答案 3 :(得分:0)

Swift4的更新:

在View Controller中:

popover?.sourceView = sender.superview
popover?.sourceRect = sender.frame
self.present(popoverContent, animated: true, completion: nil)