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

时间:2016-12-29 14:02:33

标签: swift google-maps autocomplete google-places-api google-picker

在我的应用中打开时,我需要帮助在GMSAutocompleteViewController的searchBar中设置文字。我在Google Place AutocompleteViewController中使用GMSAutocompleteViewController

enter image description here

7 个答案:

答案 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的隐藏位置,则此方法仍然可以找到它。问题是您仍然需要知道有多少个子视图级别。您可能会设置一个递归函数来处理此问题。