2017-07-23 25 views
1

我想在segue中调整弹窗视图的大小。该popover工作,但处于错误的位置。Swift 3 indexPathForSelectedRow - 获取空路径

要设置位置,我使用下面的代码试图选择当前的IndexPathForSelectedRow,然后设置弹出窗口的值。

它没有开火,我可以用一些帮助来找出原因。

我正在使用的代码如下:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 

     if segue.identifier == "RecordToNotes" { 

      if let path = detailsTable.indexPathForSelectedRow { 
       let cellFrame = detailsTable.rectForRow(at: path) 

       let vc = segue.destination 
       vc.preferredContentSize = CGSize(width: 400, height: 400) 
       let controller = vc.popoverPresentationController 
       controller?.delegate = self 
       controller?.sourceView = detailsTable 
       controller?.sourceRect = CGRect(x: cellFrame.midX + 50, y: cellFrame.midY, width: 0, height: 0) 
       controller?.permittedArrowDirections = .right 
      } 

     } 

    } 

路径返回零。谢谢你的帮助。

更新:我在cellAtRow中设置单元格。这里是该片段:

case 2: //notes 
       cell.detailPickerButton.isHidden = false 
       cell.detailPickerButton.isEnabled = true 

       cell.detailPickerButton.addTarget(self, action: #selector(detailsViewController.showNotesPanel(_:)), for: UIControlEvents.touchUpInside) 
      .... 

我不重写didSelectRow。我是不是该?

+0

我希望你是不是叫deselectRowAtIndexPath在你的didSelectRowAtIndexPath错误。这将使indexPathForSelectedRow无。 –

+0

不,我不是。我没有调用'didSelectRow'。我在'cellForRow'中添加目标调用 –

+0

你的意思是你的目标调用在cellForRow中是什么意思?我希望你打算在用户选择特定的行时显示弹出窗口,并且你会收到didSelectRowAtIndePath方法调用。 –

回答

1

尝试翻译框到您的ViewController.View坐标

使用此行

controller?.sourceRect = self.view.convert(cellFrame, from: detailsTable) 

,而不是

controller?.sourceRect = CGRect(x: cellFrame.midX + 50, y: cellFrame.midY, width: 0, height: 0) 

希望这有助于

+0

谢谢@Reinier - 我得到一个空路径,所以我没有得到一个有效的cellRect。 –

+0

这就是问题所在? @DavidDelMonte,检查你是否取消选中单元格 –

+0

也许我是在无意中取消选中单元格。我没有调用didDeselectCell。我是不是该? –