如何在 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?