은이 같은 상황 해결 :
가 controlTextDidChange
을 사용 팝 오버
제시
override func controlTextDidChange(_ obj: Notification) {
vcAddress.searchString = txtSourceAddress.stringValue
self.presentViewController(vcAddress, asPopoverRelativeTo: txtSourceAddress.bounds, of: txtSourceAddress, preferredEdge: .maxX, behavior: .semitransient)
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "AutoComplete"), object: nil)
}
팝 오버는 SearchCompleter (MapKit)을 사용해 제안을 얻는있는 TableView를 갖는다
import Cocoa
import MapKit
class AcAddress: NSViewController, NSTableViewDelegate, NSTableViewDataSource, MKLocalSearchCompleterDelegate {
var searchString:String?
var searchCompleter = MKLocalSearchCompleter()
var searchResults = [MKLocalSearchCompletion]()
@IBOutlet weak var tblAutoComplete: NSTableView!
override func viewDidLoad() {
NotificationCenter.default.addObserver(self, selector: #selector(AutoComplete), name: NSNotification.Name(rawValue: "AutoComplete"), object: nil)
searchCompleter.delegate = self
tblAutoComplete.refusesFirstResponder = true
}
@objc func notificationAutoComplete() {
searchCompleter.queryFragment = searchString ?? ""
}
func completerDidUpdateResults(_ completer: MKLocalSearchCompleter) {
searchResults = completer.results
tblAutoComplete.reloadData()
}
func numberOfRows(in tableView: NSTableView) -> Int {
return searchResults.count
}
func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
// FILL IT
}
}
그것은 팝 오버에있는 ScrollView에있는 TableView입니다. – Moritz
좋아, 이렇게 할 수있는 내 방법은 다음과 같습니다. 텍스트 필드 대리인 텍스트가 변경되었습니다.> 검색 문자열을 사용하여 팝업을 열고 제안을하도록 허용 하시겠습니까? – Ghost108
위임 텍스트는, 다음의 tableview 선택하여 텍스트 필드의 내용 (다시 수행 할 때 테이블을 유발하지 않도록 조심 교체 선택된 행 알고를 keyDown하고있는 tableView 대리자를 모니터링 만들고 팝 오버 테이블보기를 표시, 제안과 배열을 채울> 변화했다) popover를 닫는다. 그것은 많은 작업이지만 가치가 있습니다. 저는 최근의 응용 프로그램에서 이런 종류의 상호 작용을하는 사용자를했습니다. – Moritz