Thành phần Thông tin chi tiết nâng cao về địa điểm

Phiên bản Nâng cao của thành phần Thông tin chi tiết về địa điểm cung cấp các tính năng tương tự như thành phần Thông tin chi tiết về địa điểm Essentials. 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 được hiển thị.

Cấu hình thành phần Thông tin chi tiết nâng cao về địa điểm

Sử dụng AdvancedPlaceDetailsView hoặc AdvancedPlaceDetailsCompactView để sử dụng 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 AdvancedPlaceDetailsView hoặc AdvancedPlaceDetailsCompactView để 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 thu gọn thông tin chi tiết về địa điểm có các nút tuỳ chỉnh
Chế độ xem thu gọn của thành phần Thông tin chi tiết nâng cao về địa điểm có nút tuỳ chỉnh

Quan trọng: Bạn phải cho người dùng cuối 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ụ ở bên phải 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 AdvancedPlaceDetailsView hoặc AdvancedPlaceDetailsCompactView để 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ề thành phần Thông tin chi tiết nâng cao về địa điểm

Xoá các nút hành động

Swift

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

  @State var query: PlaceDetailsQuery = PlaceDetailsQuery(
    identifier: .placeID(peetsCoffeePlaceID)
  )

  var body: some View {
    AdvancedPlaceDetailsView(
      query: $query,
      configuration: AdvancedPlaceDetailsConfiguration(
        content: AdvancedPlaceDetailsView.allContent,
        theme: PlacesMaterialTheme()
      ),
      placeDetailsCallback: { result in
        if let place = result.place {
          print("Place: \(place.description)")
        } else {
          print("Error: \(String(describing: result.error))")
        }
      }
    )
    .mainActions{ _ in
      return []
    }
  }
}

Thêm các hành động tuỳ chỉnh và được xác định trước

Mẫu này thêm một lựa chọn để người dùng yêu thích hoặc bỏ yêu thích một địa điểm, cùng với hành động Mở trong Maps được xác định trước.

Swift

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

  @State var query: PlaceDetailsQuery = PlaceDetailsQuery(
    identifier: .placeID(peetsCoffeePlaceID)
  )
  
  @State var favoritePlaces: Set<String> = []

  var body: some View {
    AdvancedPlaceDetailsView(
      query: $query,
      configuration: AdvancedPlaceDetailsConfiguration(
        content: AdvancedPlaceDetailsView.allContent,
        theme: PlacesMaterialTheme()
      ),
      placeDetailsCallback: { result in
        if let place = result.place {
          print("Place: \(place.description)")
        } else {
          print("Error: \(String(describing: result.error))")
        }
      }
    )
    .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
    }
    .cornerActions { place in
      var actions: [CornerPlaceActionElement] = []
      let placeID = place.placeID!
      if self.favoritePlaces.contains(placeID) {
        actions.append(
          .action(
            CornerPlaceAction(
              image: Image(systemName: "heart.fill"),
              accessibilityLabel: "Unfavorite",
            ) { _ in self.toggleFavorite(placeID) }
          )
        )
      } else {
        actions.append(
          .action(
            CornerPlaceAction(
              image: Image(systemName: "heart"),
              accessibilityLabel: "Favorite",
            ) { _ in self.toggleFavorite(placeID) }
          )
        )
      }
      actions.append(.actionId(.openMap(style: .primary)))
      return actions
    }
  }

  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 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"

  @State var query: PlaceDetailsQuery = PlaceDetailsQuery(
    identifier: .placeID(peetsCoffeePlaceID)
  )
  let searchMediaOptions = SearchMediaOptions(query: "coffee")
  let searchReviewsOptions = SearchReviewsOptions(query: "coffee")

  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)")
      }
    }
  }
}