在我的应用中打开时,我需要帮助在GMSAutocompleteViewController
的searchBar中设置文字。我在Google Place AutocompleteViewController中使用GMSAutocompleteViewController
。
答案 0 :(得分:7)
我通过结合@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上失败,可能还会降低版本。
答案 1 :(得分:6)
@Cools
在Swift 3中,它似乎有不同的层次结构。我已经深入了解风险投资并获得了这个位置。
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"
}
但是,它有一个错误,它不会自动搜索。在我得到解决方案之后,我将再次编辑。
答案 2 :(得分:4)
我发现这里的解决方案不适用于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 :(得分:2)
我对swift编码不是很熟悉,但是基于文档 - Customize text and background colors:
您可以在自动完成UI控件中设置所有文本和背景的颜色,以使窗口小部件更贴近您的应用的视觉外观。有两种方法可以设置UI控件颜色:
- 在可能的情况下,使用原生iOS UIAppearance protocol全局设置UI控件。这些设置适用于许多(但不是全部)UI控件元素。
- 通过在窗口小部件类上使用SDK方法来设置UIAppearance protocol不支持的属性。
文档说明搜索栏文本颜色,搜索栏色调颜色和搜索栏占位符文本颜色(默认搜索文本)可以使用(UIAppearance协议或SDK方法)设置样式。
希望此信息有所帮助。
答案 4 :(得分:2)
您可以使用
之类的内容在此搜索栏中插入文本function countdown($number)
{
$i = $number;
while ($i>0)
{
if (($number % $i) !== 0)
{
echo $i--;
}
}
}
答案 5 :(得分:2)
- (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 :(得分:2)
嗯,我不一定建议您采取这种行动,因为如果您想要更多控制权,则应该使用UISearchResults Controller。但是,这是一个快速版本:
//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的位置。它基本上是试图将所有子视图展平到一个数组中,并从数组中过滤出SearchBar。如果Google决定更改SearchBar的隐藏位置,则此方法仍然可以找到它。问题是您仍然需要知道有多少个子视图级别。您可能会设置一个递归函数来处理此问题。