如何在 Google Place AutocompleteViewController 的 GMSAutocompleteViewController 中设置文本

Posted

技术标签:

【中文标题】如何在 Google Place AutocompleteViewController 的 GMSAutocompleteViewController 中设置文本【英文标题】:How to set text in GMSAutocompleteViewController in Google Place AutocompleteViewController 【发布时间】:2017-05-13 20:51:36 【问题描述】:

在我的应用程序中打开时,我需要帮助在 GMSAutocompleteViewController 的搜索栏中设置文本。我在Google Place AutocompleteViewController 中使用GMSAutocompleteViewController

【问题讨论】:

【参考方案1】:

好吧,我不一定推荐这种做法,因为如果您想要更多控制权,您应该使用 UISearchResults 控制器。但是,这里有一个更快捷的版本:

//Where viewController is the GMSAutocompleteViewController
if let searchBar = (viewController.view.subviews
   .flatMap  $0.subviews 
   .flatMap  $0.subviews 
   .flatMap  $0.subviews 
   .filter  $0 == $0 as? UISearchBar).first as? UISearchBar 
            searchBar.text = "YOUR_TEXT_HERE"
            searchBar.delegate?.searchBar?(searchBar, textDidChange: "YOUR_TEXT_HERE") // to get the autoComplete Response

    

这种方法的好处是您不必知道 SearchBar 的确切位置。它基本上是试图将所有子视图展平到一个数组中并从数组中过滤掉 SearchBar。如果 Google 决定更改 SearchBar 的隐藏位置,这种方法仍然可以找到它。问题是您仍然需要知道有多少级别的子视图。您可以设置一个递归函数来处理这个问题。

【讨论】:

感谢您的解决方案,虽然我理解您对搜索栏位置的担忧,但现在它按预期工作(Y),我们可以使用 ``` searchBar.delegate?.searchBar?(searchBar, textDidChange: "Your address")``` 获取自动完成响应。【参考方案2】:

我发现这里的解决方案不适用于 ios 10。所以我编写了用于查找具体视图的递归方法 - UISearchBar,在我们的例子中:

extension UIView 
    func getViewWithConcreteType<T: UIView>()-> T? 
        if let concreteSubview = self as? T 
            return concreteSubview
        

        for subview in subviews 
            let concreteView: T? = subview.getViewWithConcreteType()
            if concreteView != nil 
                return concreteView!
            
        

        return nil
    

对原来的解决方案做了一些修改:

let views = autocompleteController.view.subviews
            let subviewsOfSubview = views.first!.subviews
            let subOfNavTransitionView = subviewsOfSubview[1].subviews
            let subOfContentView = subOfNavTransitionView[2].subviews

            if let searchBar = subOfContentView[0] as? UISearchBar 
                searchBar.text = text
                searchBar.delegate?.searchBar?(searchBar, textDidChange: text)
             else 
                let searchBar: UISearchBar? = autocompleteController.view.getViewWithConcreteType()
                searchBar?.text = text
                searchBar.map  $0.delegate?.searchBar?($0, textDidChange: text) 
            

【讨论】:

【参考方案3】:

通过结合@Youngjin 和@Exception 对 Swift 4 和 Google Places 2.6.0 的回答,我得到了一个可行的解决方案

访问 GMSAutocompleteViewController 搜索栏:

let views = gmsAutoCompleteViewController.view.subviews
let subviewsOfSubview = views.first!.subviews
let subOfNavTransitionView = subviewsOfSubview[1].subviews
let subOfContentView = subOfNavTransitionView[2].subviews     
let searchBar = subOfContentView[0] as! UISearchBar

然后设置文本也自动搜索

searchBar.text = "Your address"
searchBar.delegate?.searchBar?(searchBar, textDidChange: "Your address") // This performs the automatic searching.

我发现在尝试从内部设置文本时收到 EXC_BAD_ACCESS 错误 didRequestAutocompletePredictions(_ viewController: GMSAutocompleteViewController).

所以我把这段代码放在我展示 autoCompleteController 的完成块中,它可以正常工作。

将它们结合在一起:

let gmsAutoCompleteViewController = GMSAutocompleteViewController()
gmsAutoCompleteViewController.delegate = self

present(gmsAutoCompleteViewController, animated: true) 
    let views = gmsAutoCompleteViewController.view.subviews
    let subviewsOfSubview = views.first!.subviews
    let subOfNavTransitionView = subviewsOfSubview[1].subviews
    let subOfContentView = subOfNavTransitionView[2].subviews
    let searchBar = subOfContentView[0] as! UISearchBar
    searchBar.text = "Your address"
    searchBar.delegate?.searchBar?(searchBar, textDidChange: "Your address")

编辑:我发现这个解决方案似乎只适用于 iOS 11。 let searchBar = subOfContentView[0] as! UISearchBar 在 iOS 10 和可能更低的版本上会失败。

【讨论】:

谢谢兄弟,很棒的解决方案! 我的下一行 let searchBar = subOfContentView[0] 崩溃了! ios 10 中的 UISearchBar。能否请您告诉低版本的替代方案 自 gmsAutoCompleteViewController.view.subviews.count = 0 后无法在 iOS 12 上运行【参考方案4】:

@酷儿

在 Swift 3 中,它似乎有不同的层次结构。我已经深入 VC 并得到了这个位置。

func didRequestAutocompletePredictions(_ viewController: GMSAutocompleteViewController) 
    let views = viewController.view.subviews
    let subviewsOfSubview = views.first!.subviews
    let subOfNavTransitionView = subviewsOfSubview[1].subviews
    let subOfContentView = subOfNavTransitionView[2].subviews
    let searchBar = subOfContentView[0] as! UISearchBar
    searchBar.text = "YOUR_TEXT"

但是,它有一个缺点,它不能自动搜索。得到解决方案后,我会再次编辑。

【讨论】:

完美解决方案!【参考方案5】:
- (void)viewDidLoad 
    [super viewDidLoad];

    acController = [[GMSAutocompleteViewController alloc] init];

    acController.delegate = self;


- (IBAction)btnSearch1:(id)sender 
    [self presentViewController:acController animated:YES completion:nil];


- (void)didRequestAutocompletePredictions:(GMSAutocompleteViewController *)viewController 
    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;

    UIView *Views = viewController.view;

    NSArray *Aar2 = [[Views subviews][0] subviews];

    UIView *View2 = Aar2[1];

    UIView *View3 = [View2 subviews][2];

    UISearchBar *Search = [[View3 subviews] firstObject];

    Search.text = @"Your text";

    [Search.delegate searchBar:Search textDidChange:txtAddress.text];

// 酷酷的男人

【讨论】:

【参考方案6】:

您可以使用类似的方式在此搜索栏中插入文本

func injectTextInSearchView(_ text: String, _ view: UIView) 
    if let view = view as? UISearchBar 
        view.text = text
        view.delegate?.searchBar!(view, textDidChange: text)
        return
    
    for subview in view.subviews 
        injectTextInSearchView(text, subview)
    

【讨论】:

【参考方案7】:

我对快速编码不是很熟悉,但基于文档 - Customize text and background colors:

您可以在自动完成 UI 控件中设置所有文本和背景的颜色,以使小部件与您的应用的视觉外观更加匹配。 UI控件颜色有两种设置方式:

尽可能使用原生 iOS UIAppearance protocol 来全局样式化 UI 控件。这些设置适用于许多(但不是全部) UI 控件元素。 通过使用小部件类上的 SDK 方法来设置 UIAppearance protocol 不支持的属性。

文档说明搜索栏文本颜色、搜索栏色调颜色和搜索栏占位符文本颜色(默认搜索文本)可以使用(UIAppearance 协议或 SDK 方法)设置样式。

希望这些信息对您有所帮助。

【讨论】:

这不是相关的答案

以上是关于如何在 Google Place AutocompleteViewController 的 GMSAutocompleteViewController 中设置文本的主要内容,如果未能解决你的问题,请参考以下文章

如何在工具栏中实现自动完成 google place api - Android

给定这个 google place url,我如何获取地址和坐标? [复制]

如何通过google javascript api获取知道place_id的位置坐标

如何将从 Google Place API 获取的信息存储到 Firebase?

舍入Google Maps API中的place.geometry.location值

以(Json 格式)解析来自 Google Place api 响应的数据