yammerjp / PinsOfMap

iphone app to add pins of map
0 stars 0 forks source link

機能 追加検索 - ジオコーディング #4

Closed yammerjp closed 5 years ago

yammerjp commented 5 years ago

検索

UISearchBarにユーザーが入力した場所のは前or住所から、ジオコーディングして緯度と経度を検索する。 候補をリストで表示し、特定の候補がタップされたら地図のその場所をピンで指す

Tabの追加

yammerjp commented 5 years ago

UI Search bar

class ViewController: UIViewController, UISearchBarDelegate  {
    @IBOutlet weak var searchBar: UISearchBar!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        searchBar.delegate = self
        searchBar.showsCancelButton = true
        //プレースホルダの指定
        searchBar.placeholder = "検索文字列を入力してください"
        //検索スコープを指定するボタン
        searchBar.scopeButtonTitles  = ["果物", "野菜"]
        searchBar.showsScopeBar = true
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    func searchBarSearchButtonClicked(searchBar:UISearchBar) {
        print("検索ボタンがタップ scopeIndex=\(searchBar.selectedScopeButtonIndex)")
    }

    func searchBarCancelButtonClicked(searchBar: UISearchBar) {
        print("キャンセルボタンがタップ")
    }
}

参考:UI SearchBarの基本

yammerjp commented 5 years ago

あとで実装予定: タブを自動遷移

yammerjp commented 5 years ago

ジオコーディングのメソッドなど。ジオコーディング自体はそれほど難しくない

yammerjp commented 5 years ago

UISearchBarで文字入力中に、キーボード以外をタップするとフォーカスを外す。

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        if searchBar.isFirstResponder {
            searchBar.resignFirstResponder()
        }
// UIViewController.touchesBegan()でタッチイベントを取得できる
// UIItemHogehoge.isfirstResponder :Bool で UIItemHogehogeにフォーカスが乗っているかわかる
// UIItemHogehoge.resignFirstResponder() でフォーカスが外れる
    }

参考: [swift]UITextFiledでキーボード以外タップでキーボードを非表示にする

yammerjp commented 5 years ago

タブを強制的に遷移させるのは可能。 ただ、遷移後にマップの位置を移動させるのができない。 当初はdelegateで対応しようと思っていたが、UIViewControllerで生成されたものと違うインスタンスを生成してしまうので、表示しているインスタンスのメソッドをさわれず変化させられない、と推測。

値渡しは(汚いが)グローバル変数に任せて、タブ遷移時に場所を移動させるメソッドを実行させたいのだが

yammerjp commented 5 years ago

UITabBarController.viewControllers[0]からメソッド呼べたりとかしないんでしょうか。

yammerjp commented 5 years ago

呼べた。

        if let controller: ViewController = tabBarController?.viewControllers?[0] as? ViewController {
            controller.showPoint(point: coordinate!)

        }