我在Swift中创建一个表格视图,每个单元格都包含一个按钮。 点击按钮时,该按钮上会显示一个弹出窗口。
我的问题是,无论我在哪个单元格中单击按钮,弹出框始终显示在第一个单元格上。
请参阅附图以了解更多信息。
下面是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”只是第一个单元格中的按钮。我该如何解决这个问题?
答案 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)