2017-09-06 181 views
0

我與SWIFT 4工作OSX,我想實現像蘋果地圖一地址自動完成功能的作用:自動完成功能的下拉

enter image description here

我怎麼能這樣做的圖像顯示? 我猜的結構將是:

  • 一個簡單的NSTextField
  • 但什麼是彈出式菜單?這是一個簡單的popover嗎?

UPDATE 現在我的程序是這樣的:

enter image description here

那是輝煌的。 但一個小問題:

我寫我的第一個字符到文本字段,彈出窗口將顯示,並且文本字段失去焦點。現在我必須再次點擊我的文本框才能繼續。有沒有辦法保持這個文本框的重點?

+0

這是一個彈出窗口中的ScrollView的TableView。 – Moritz

+0

沒問題,所以我這樣做的方式可能是:textfield委託文本確實改變>打開搜索字符串的popover並讓他們提出建議,不是嗎? – Ghost108

+0

委託文本確實改變了>用命題填充數組,在彈出窗口中創建並顯示錶視圖,監視keyDown和tableView委託以知道哪一行被選中,然後用tableview選擇替換文本內容(注意不要在觸發表時再次觸發表)並關閉popover。這是很多工作,但它是值得的,我已經在最近的應用程序中完成了它,用戶喜歡這種交互。 – Moritz

回答

0

我解決像這樣的情況:

使用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) 
} 

的酥料餅具有的tableview,它獲取與SearchCompleter(MapKit)的建議

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 

     } 

    } 
+1

我嘗試稍後更新它 - 此刻我不在家 – Ghost108