Thành phần Tìm kiếm địa điểm nâng cao

Phiên bản Nâng cao của thành phần Tìm kiếm địa điểm cung cấp các tính năng tương tự như phiên bản Essentials của thành phần Tìm kiếm địa điểm. Phiên bản này cũng cho phép bạn định cấu hình các nút hành động của thành phần và áp dụng các lựa chọn tìm kiếm và lọc cho các bài đánh giá và nội dung nghe nhìn xuất hiện.

Cấu hình Tìm kiếm địa điểm nâng cao

Sử dụng AdvancedPlaceSearchView để truy cập vào các tính năng Nâng cao.

Định cấu hình các nút hành động

Sử dụng các phương thức .cornerActions.mainActions của AdvancedPlaceSearchView để xoá hoặc tuỳ chỉnh các nút hành động.

Yêu cầu về thông tin ghi công trực quan

Chế độ xem AdvancedPlace Search có các nút tuỳ chỉnh
Kết quả Tìm kiếm địa điểm có nút tuỳ chỉnh

Quan trọng: Bạn phải cho người dùng biết rõ khi nào một nút hành động tuỳ chỉnh sẽ chia sẻ thông tin người dùng với một bên thứ ba không phải là Google. Xem các yêu cầu về thông tin ghi công trực quan .

Ví dụ này cho thấy một hình ảnh tuỳ chỉnh cho biết rõ rằng thông tin người dùng sẽ được gửi đến "Altostrat".

Áp dụng các lựa chọn tìm kiếm và lọc

Sử dụng các phương thức .searchMediaOptions.searchReviewOptions của AdvancedPlaceSearchView để bật tính năng tìm kiếm và lọc cho nội dung nghe nhìn hoặc bài đánh giá.

Ví dụ về Tìm kiếm địa điểm nâng cao

Tạo nút hành động chính và xoá các hành động ở góc

Mẫu mã này tạo một nút hành động chính để thêm hoặc xoá một địa điểm khỏi danh sách yêu thích. Mẫu mã này cũng đảm bảo rằng không có hành động nào ở góc được định cấu hình.

Swift

struct AdvancedPlaceSearchDemoView: View {
  private let configuration = AdvancedPlaceSearchConfiguration(
    content: [.address(), .rating(), .type()],
    preferTruncation: true, // default is false
    theme: PlacesMaterialTheme(),
    attributionPosition: .bottom, // default is top
    mediaSize = .medium, // default is .small
    selectable: true // default is false
  )
  // can also do let placeSearchViewRequest = .searchNearby(...) to  configure a searchNearby request
  @State private var placeSearchViewRequest = .searchByText(
    SearchByTextRequest(
      textQuery: "Googleplex",
      placeProperties: [.all],
      locationBias: CircularCoordinateRegion(
        center: CLLocationCoordinate2D(latitude: 0, longitude: 0),
        radius: 0
      )
    )
  )

  @State private var favoritePlaces: Set<String> = []

  var body: some View {
    AdvancedPlaceSearchView(
      orientation: .horizontal, // default is vertical
      request: placeSearchViewRequest,
      configuration: configuration
    )
    .onLoad { places in
      print("places: \(places)")
    }
    .onRequestError { error in
      print("error: \(error)")
    }
    .onPlaceSelected { place, index in
      print("place: \(place)")
      print("index: \(index)")
    }
    .mainActions { place in
      var actions: [MainPlaceActionElement] = []

      let placeID = place.placeID!
      if self.favoritePlaces.contains(placeID) {
        actions.append(
          .action(
            MainPlaceAction(
              image: Image(systemName: "heart.fill"),
              label: "Unfavorite"
            ) { _ in self.toggleFavorite(placeID) }
          )
        )
      } else {
        actions.append(
          .action(
            MainPlaceAction(
              image: Image(systemName: "heart"),
              label: "Favorite"
            ) { _ in self.toggleFavorite(placeID) }
          )
        )
      }
      actions.append(.actionId(.openMap(style: .primary)))
      return actions
    }
    // Ensures that there are no corner actions.
    .cornerActions { _ in
      return []
    }
  }

  func toggleFavorite(_ placeID: String) {
    if favoritePlaces.contains(placeID) {
      favoritePlaces.remove(placeID)
    } else {
      favoritePlaces.insert(placeID)
    }
  }
}

        

Lọc bài đánh giá và nội dung nghe nhìn

Mẫu mã này lọc kết quả tìm kiếm để chỉ hiển thị nội dung nghe nhìn và bài đánh giá có đề cập đến "cà phê".

Swift

struct DemoView: View {
  static let peetsCoffeePlaceID = "ChIJT7FdmYiAhYAROFOvrIxRJDU"

  // Query for loading the place details component.
  @State var query: PlaceDetailsQuery = PlaceDetailsQuery(
    identifier: .placeID(peetsCoffeePlaceID)
  )
  let searchMediaOptions = SearchMediaOptions(query: "coffee", rankPreference: .newest)
  let searchReviewOptions = SearchReviewsOptions(query: "coffee", rankPreference: .newest)

  var body: some View {
    AdvancedPlaceDetailsView(
      query: $query,
      configuration: AdvancedPlaceDetailsConfiguration(
        content: [.media(), .reviews()],
        theme: PlacesMaterialTheme()
      ),
      placeDetailsCallback: { _ in }
    )
    .searchMediaOptions(searchMediaOptions) { results in
      guard let result = results.first else { return }
      switch result {
      case .success(let summary):
        print("Summary: \(summary)")
      case .failure(let error):
        print("Error: \(error)")
      }
    }
    .searchReviewsOptions(searchReviewsOptions) { results in
      guard let result = results.first else { return }
      switch result {
      case .success(let summary):
        print("Summary: \(summary)")
      case .failure(let error):
        print("Error: \(error)")
      }
    }
  }