คอมโพเนนต์การค้นหาสถานที่ขั้นสูง

คอมโพเนนต์การค้นหาสถานที่เวอร์ชันขั้นสูงมีฟีเจอร์เหมือนกับคอมโพเนนต์การค้นหาสถานที่เวอร์ชัน Essentials นอกจากนี้ยังช่วยให้คุณกำหนดค่าปุ่มการทำงานของคอมโพเนนต์ รวมถึงใช้ตัวเลือกการค้นหาและการกรองกับรีวิวและสื่อที่ปรากฏได้ด้วย

การกำหนดค่าการค้นหาสถานที่ขั้นสูง

ใช้ AdvancedPlaceSearchView เพื่อเข้าถึงฟีเจอร์ขั้นสูง

กำหนดค่าปุ่มการทำงาน

ใช้วิธี .cornerActions และ .mainActions ของ AdvancedPlaceSearchView เพื่อนำปุ่มการทำงานออกหรือปรับแต่งปุ่มการทำงาน

ข้อกำหนดการระบุแหล่งที่มาด้วยภาพ

มุมมองการค้นหาสถานที่ขั้นสูงพร้อมปุ่มที่ปรับแต่งแล้ว
ผลการค้นหาสถานที่พร้อมปุ่มที่กำหนดเอง

สำคัญ: คุณต้องแจ้งให้ผู้ใช้ทราบอย่างชัดเจนเมื่อปุ่มการทำงานที่กำหนดเองจะแชร์ข้อมูลผู้ใช้กับบุคคลที่สามที่ไม่ใช่ Google ดูข้อกำหนดการระบุแหล่งที่มาด้วยภาพ

ตัวอย่างแสดงรูปภาพที่กำหนดเองซึ่งระบุอย่างชัดเจนว่าจะมีการส่งข้อมูลผู้ใช้ไปยัง "Altostrat"

ใช้ตัวเลือกการค้นหาและการกรอง

ใช้วิธี .searchMediaOptions และ .searchReviewOptions ของ AdvancedPlaceSearchView เพื่อเปิดใช้การค้นหาและการกรองสื่อหรือรีวิว

ตัวอย่างการค้นหาสถานที่ขั้นสูง

สร้างปุ่มการทำงานหลักและนำการทำงานที่มุมออก

ตัวอย่างโค้ดนี้สร้างปุ่มการทำงานหลักเพื่อตั้งเป็นรายการโปรดหรือยกเลิกการตั้งเป็นรายการโปรดของสถานที่ นอกจากนี้ยังตรวจสอบว่าไม่มีการกำหนดค่าการทำงานที่มุม

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

        

กรองรีวิวและสื่อ

ตัวอย่างโค้ดนี้กรองผลการค้นหาเพื่อแสดงเฉพาะสื่อและรีวิวที่พูดถึง "กาแฟ"

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