@KenThomasesでconvoをオフにすると、テーブルビューのセル自体がポップオーバーを管理するのが最善の方法ですが、それは半分に過ぎません。私は説明します:
テーブルはテーブルのセルビューを再描画するので、contactTableCellViewはNSPopoverの存続期間全体にわたって存在することを約束できません。 contactTableCellViewと無関係なライフサイクルを持つpopoverが存在するためには、NSTableView(addressBookViewControllerと呼ぶことができます)を保持するクラスにNSPopoverオブジェクトが存在する必要がありました。したがって、addressBookViewControllerにはcontactPopoverという名前のメンバーがあり、addressBookViewControllerがまだメモリ内にある限り、ポップオーバーが存在することが確認できます。これに関する問題は、ポップオーバーがリンクするための正しい境界を取得することでした。
あなたが現在のcontactTableCellViewをaddressBookViewControllerに戻して、@ KenThomasesのようにcontactPopover.show(relativeTo:contactTableCellView.bounds of:contactTableCellView preferredEdge:.minY)
のようなものを使用すると、Popoverは、どの要素に移動してもNSTableViewの最初の/先頭の要素に固執しますしかし、私は、ポップオーバーが上に乗っている要素を指すようにしたい。
私の仮説を証明するための参考資料は見つかりませんでしたが、私の結果から、NSTableViewには私が作成したカスタムContactTableCellViewを含むセル/ビューがあるようです。これは私が "contactTableCellView.frameにはいつも(x、y)=(0,0)"があるという理由です。フレームは常に親オブジェクトと相対的です。この場合、TableCellViewと同じサイズのビュー/セルです。そして、この外部ビューには、私が望んでいたフレーム/想定されたcontactTableCellView.frameがあるというフレームがありました。これを明確に言うには:
contactTableCellView.superView?.frameはNSTableViewに正しい(x、y)を与え、このフレームは削除されません。なぜなら、contactTableCellViewはさまざまな理由で再描画されるからです。私の調査結果を使用して、私はポップオーバーを得ることができた私はスウィフト3におおよそ次のように望んでいたように、正しい要素に対する相対表示されます。
class AddressBookViewController {
...
var contactCardPopover: NSPopover?
...
func showContact(sender: AnyObject, contact: ContactVM) {
guard let contactTableCellView = sender as? ContactTableCellView else { return }
// when contactCardVC is non-nil, a popover currently open. This makes sure 2 don't open in the same tableView.
if contactViewController == nil {
contactCardViewController = ContactViewController(contact: contact)
// this here is the important part!!!! Using the contactTableCellView.superview
if let tableCell = participantTableCellView.superview {
contactCardPopover = NSPopover(contentViewController: contactCardViewController, sender: tableCell, bounds: tableCell.frame)
contactCardPopover.delegate = self
}
}
}
}
私NSPopoverがオン動作しますので、そうContactTableCellViewのスーパーは、正しいフレームを持っています私が元々望んでいたようなカスタムNSTableCellView!この特定の部分を理解するのに数時間かかりました。
この問題を明確にするために、私が現在持っているものを投稿しますが、これは私の会社の製品のためではありません。 – Kirkova