Bird
Raised Fist0
iOS Swiftmobile~20 mins

Pull-to-refresh (refreshable) in iOS Swift - Practice Problems & Coding Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Pull-to-Refresh Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ ui_behavior
intermediate
2:00remaining
What happens when you pull down on a SwiftUI List with .refreshable modifier?
Consider a SwiftUI List with the .refreshable modifier added. What is the expected behavior when the user pulls down on the list?
iOS Swift
List(items, id: \.self) { item in
  Text(item)
}
.refreshable {
  await fetchData()
}
AThe list crashes because .refreshable is not supported on List.
BThe list immediately reloads without calling fetchData(), no indicator is shown.
CNothing happens because .refreshable requires a button press to activate.
DThe list triggers the fetchData() async function and shows a spinning indicator until it completes.
Attempts:
2 left
💡 Hint
Think about what .refreshable is designed to do in SwiftUI.
❓ lifecycle
intermediate
1:30remaining
When does the refresh closure run in a SwiftUI .refreshable modifier?
In SwiftUI, the .refreshable modifier takes an async closure. When exactly is this closure executed?
iOS Swift
List { ... }
.refreshable {
  await loadData()
}
AOnly when the user pulls down far enough to trigger the refresh control.
BImmediately when the view appears on screen.
CEvery time the list scrolls up or down.
DWhen the user taps on any list item.
Attempts:
2 left
💡 Hint
Think about user interaction with pull-to-refresh.
🔧 Debug
advanced
2:30remaining
Why does the spinner never stop after pull-to-refresh in this SwiftUI code?
Given this SwiftUI code snippet, the spinner shows but never disappears after pulling to refresh. What is the cause?
iOS Swift
List(items, id: \.self) { item in
  Text(item)
}
.refreshable {
  fetchData()
}
AThe List must be inside a ScrollView for refreshable to work.
BThe .refreshable modifier requires a synchronous closure.
CfetchData() is not awaited, so the refresh never completes.
DThe items array is empty, so the spinner stays indefinitely.
Attempts:
2 left
💡 Hint
Check if the async function is awaited properly.
🧠 Conceptual
advanced
1:00remaining
What is the minimum iOS version that supports SwiftUI's .refreshable modifier?
You want to use the .refreshable modifier in your SwiftUI app. Which iOS version must your app target at minimum?
AiOS 15.0
BiOS 14.0
CiOS 13.0
DiOS 16.0
Attempts:
2 left
💡 Hint
Check Apple documentation for .refreshable availability.
❓ navigation
expert
3:00remaining
How to programmatically trigger pull-to-refresh in SwiftUI List with .refreshable?
You want to start the refresh spinner and call the refresh closure programmatically without user pulling down. Which approach works best?
ACall the .refreshable closure directly from code using a function reference.
BUse UIKit's UIRefreshControl and integrate it with SwiftUI List via UIViewRepresentable.
CUse a @State boolean to conditionally show a ProgressView above the List and call fetchData() manually.
DSet the List's scroll position to top programmatically to simulate pull-to-refresh.
Attempts:
2 left
💡 Hint
SwiftUI does not provide a direct API to trigger .refreshable programmatically.

Practice

(1/5)
1. What does the .refreshable modifier do in a SwiftUI List?
easy
A. Disables scrolling in the list
B. Automatically sorts the list items alphabetically
C. Changes the list background color
D. Allows users to pull down to refresh the list content

Solution

  1. Step 1: Understand the purpose of .refreshable

    The .refreshable modifier adds pull-to-refresh functionality to scrollable views like List.
  2. Step 2: Identify what pull-to-refresh does

    Pull-to-refresh lets users pull down the list to trigger a data update or refresh action.
  3. Final Answer:

    Allows users to pull down to refresh the list content -> Option D
  4. Quick Check:

    Pull-to-refresh = update list by pulling down [OK]
Hint: Pull-to-refresh updates list by pulling down [OK]
Common Mistakes:
  • Thinking it sorts the list automatically
  • Confusing it with disabling scroll
  • Assuming it changes UI colors
2. Which of the following is the correct syntax to add pull-to-refresh to a SwiftUI List?
easy
A. List { ... }.refreshable { await loadData() }
B. List { ... }.onRefresh { loadData() }
C. List { ... }.refresh { loadData() }
D. List { ... }.pullToRefresh { await loadData() }

Solution

  1. Step 1: Recall the official SwiftUI modifier for pull-to-refresh

    The correct modifier is .refreshable with an async closure.
  2. Step 2: Match syntax with options

    List { ... }.refreshable { await loadData() } uses .refreshable { await loadData() } which is correct syntax.
  3. Final Answer:

    List { ... }.refreshable { await loadData() } -> Option A
  4. Quick Check:

    Correct modifier = .refreshable [OK]
Hint: Use .refreshable with async closure for pull-to-refresh [OK]
Common Mistakes:
  • Using .onRefresh instead of .refreshable
  • Missing await keyword in async closure
  • Using non-existent modifiers like .pullToRefresh
3. Given this SwiftUI code snippet, what happens when the user pulls down the list?
List(items, id: \.self) { item in
  Text(item)
}
.refreshable {
  await fetchNewItems()
}
medium
A. The list reloads with new items after fetchNewItems completes
B. The list scrolls to the top without changing data
C. Nothing happens because refreshable requires a button
D. The app crashes due to missing completion handler

Solution

  1. Step 1: Understand the effect of .refreshable with async closure

    When user pulls down, fetchNewItems() runs asynchronously to update data.
  2. Step 2: Identify expected behavior after data fetch

    After fetchNewItems() completes, the list reloads showing updated items.
  3. Final Answer:

    The list reloads with new items after fetchNewItems completes -> Option A
  4. Quick Check:

    Pull-to-refresh triggers async update = list reload [OK]
Hint: Pull triggers async fetch, then list updates [OK]
Common Mistakes:
  • Thinking refreshable needs a button
  • Assuming no data change happens
  • Believing app crashes without completion
4. What is wrong with this SwiftUI pull-to-refresh code?
List(data) { item in
  Text(item.name)
}
.refreshable {
  fetchData()
}
medium
A. List requires an explicit id parameter
B. refreshable cannot be used on List
C. fetchData() is missing await and async keywords
D. Text cannot display item.name

Solution

  1. Step 1: Check the refreshable closure requirements

    The closure must be async and await the async function inside.
  2. Step 2: Identify missing async/await usage

    fetchData() is called without await and the closure is not marked async, causing a compile error.
  3. Final Answer:

    fetchData() is missing await and async keywords -> Option C
  4. Quick Check:

    refreshable closure must be async with await calls [OK]
Hint: Use async closure and await inside refreshable [OK]
Common Mistakes:
  • Forgetting to mark closure async
  • Calling async functions without await
  • Thinking refreshable can't be used on List
5. You want to add pull-to-refresh to a SwiftUI ScrollView that shows a list of messages. Which approach correctly updates the messages asynchronously when pulled?
hard
A. Use .onPull modifier with a synchronous closure
B. Use .refreshable on ScrollView with an async closure that updates the messages array
C. Add a Button inside ScrollView to manually refresh messages
D. Wrap ScrollView in a VStack and call a refresh function onAppear

Solution

  1. Step 1: Identify the correct modifier for pull-to-refresh on ScrollView

    The .refreshable modifier works on ScrollView and accepts an async closure.
  2. Step 2: Confirm asynchronous update of messages

    The async closure should update the messages array to refresh the UI after pull.
  3. Step 3: Evaluate other options

    The other options do not provide pull-to-refresh behavior: using non-existent modifiers, refreshing on appear, or requiring manual buttons.
  4. Final Answer:

    Use .refreshable on ScrollView with an async closure that updates the messages array -> Option B
  5. Quick Check:

    Pull-to-refresh on ScrollView = .refreshable async closure [OK]
Hint: Use .refreshable with async closure on ScrollView [OK]
Common Mistakes:
  • Trying to refresh with onAppear instead of pull
  • Using buttons instead of pull-to-refresh
  • Using non-existent modifiers like .onPull
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard