مكوّن "تفاصيل المكان المتقدّمة"

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

إعدادات مكوّن "تفاصيل المكان المتقدّمة"

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

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

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

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

العرض المكثّف لتفاصيل المكان مع أزرار مخصّصة
عرض مضغوط لتفاصيل المكان المتقدّمة مع زر مخصّص

ملاحظة مهمة: يجب أن توضّح للمستخدمين النهائيين متى سيشارك زر إجراء مخصّص معلومات المستخدم مع جهة خارجية غير Google. يمكنك الاطّلاع على متطلبات تحديد المصدر المرئي.

يعرض المثال على يسار الصفحة صورة مخصّصة توضّح أنّه سيتم إرسال معلومات المستخدم إلى "Altostrat".

تطبيق خيارات البحث والفلترة

استخدِم الطريقتَين .searchMediaOptions و.searchReviewOptions في AdvancedPlaceDetailsView أو AdvancedPlaceDetailsCompactView لتفعيل البحث والفلترة للوسائط أو المراجعات.

أمثلة على مكوّن "تفاصيل المكان المتقدّمة"

إزالة أزرار الإجراءات

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 []
    }
  }
}

إضافة إجراءات مخصّصة ومحدّدة مسبقًا

يضيف هذا النموذج خيارًا للمستخدم لوضع علامة على مكان كمفضّل أو إزالة هذه العلامة عنه، بالإضافة إلى الإجراء Open in Maps المحدّد مسبقًا.

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

فلترة المراجعات والوسائط

لا يعرض نموذج الرمز البرمجي هذا سوى الوسائط والمراجعات التي تتضمّن كلمة "قهوة".

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