مكوِّن "البحث المتقدّم عن الأماكن"

يوفّر الإصدار المتقدّم من مكوِّن "البحث عن الأماكن" الميزات نفسها التي يوفّرها الإصدار Place Search Essentials. ويتيح لك أيضًا ضبط أزرار الإجراءات في المكوِّن وتطبيق خيارات البحث والفلترة على المراجعات والوسائط التي تظهر.

إعداد مكوِّن "البحث المتقدّم عن الأماكن"

استخدِم AdvancedPlaceSearchView للوصول إلى الميزات المتقدّمة.

ضبط أزرار الإجراءات

استخدِم الطريقتَين .cornerActions و.mainActions في AdvancedPlaceSearchView لإزالة أزرار الإجراءات أو تخصيصها.

متطلبات تحديد المصدر المرئي

طريقة عرض "البحث المتقدّم" في AdvancedPlace مع أزرار مخصّصة
نتيجة "البحث عن الأماكن" مع زر مخصّص

ملاحظة مهمة: يجب أن توضّح للمستخدمين متى سيشارك زر إجراء مخصّص معلومات المستخدم مع جهة خارجية غير 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)")
      }
    }
  }