Bird
Raised Fist0
iOS Swiftmobile~20 mins

Slider in iOS Swift - Mini App: Build & Ship

Choose your learning style10 modes available
Build: Volume Control
This screen lets the user adjust the volume using a slider. The current volume value is shown above the slider.
Target UI
-----------------------
| Volume Control       |
|---------------------|
| Volume: 50          |
|                     |
| [----------O-------] |
|                     |
|                     |
-----------------------
Add a UISlider that ranges from 0 to 100.
Display the current slider value as an integer above the slider.
Update the displayed value in real-time as the slider moves.
Starter Code
iOS Swift
import UIKit

class VolumeControlViewController: UIViewController {

    let volumeLabel = UILabel()
    let volumeSlider = UISlider()

    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .systemBackground

        volumeLabel.textAlignment = .center
        volumeLabel.font = UIFont.systemFont(ofSize: 24)
        volumeLabel.text = "Volume: 50"

        volumeSlider.minimumValue = 0
        volumeSlider.maximumValue = 100
        volumeSlider.value = 50

        // TODO: Add target for slider value change

        volumeLabel.translatesAutoresizingMaskIntoConstraints = false
        volumeSlider.translatesAutoresizingMaskIntoConstraints = false

        view.addSubview(volumeLabel)
        view.addSubview(volumeSlider)

        NSLayoutConstraint.activate([
            volumeLabel.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 40),
            volumeLabel.centerXAnchor.constraint(equalTo: view.centerXAnchor),

            volumeSlider.topAnchor.constraint(equalTo: volumeLabel.bottomAnchor, constant: 20),
            volumeSlider.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 40),
            volumeSlider.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -40)
        ])
    }
Task 1
Task 2
Solution
iOS Swift
import UIKit

class VolumeControlViewController: UIViewController {

    let volumeLabel = UILabel()
    let volumeSlider = UISlider()

    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .systemBackground

        volumeLabel.textAlignment = .center
        volumeLabel.font = UIFont.systemFont(ofSize: 24)
        volumeLabel.text = "Volume: 50"

        volumeSlider.minimumValue = 0
        volumeSlider.maximumValue = 100
        volumeSlider.value = 50
        volumeSlider.addTarget(self, action: #selector(sliderValueChanged(_:)), for: .valueChanged)

        volumeLabel.translatesAutoresizingMaskIntoConstraints = false
        volumeSlider.translatesAutoresizingMaskIntoConstraints = false

        view.addSubview(volumeLabel)
        view.addSubview(volumeSlider)

        NSLayoutConstraint.activate([
            volumeLabel.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 40),
            volumeLabel.centerXAnchor.constraint(equalTo: view.centerXAnchor),

            volumeSlider.topAnchor.constraint(equalTo: volumeLabel.bottomAnchor, constant: 20),
            volumeSlider.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 40),
            volumeSlider.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -40)
        ])
    }

    @objc func sliderValueChanged(_ sender: UISlider) {
        let currentValue = Int(sender.value)
        volumeLabel.text = "Volume: \(currentValue)"
    }
}

We added a target to the slider that calls sliderValueChanged whenever the slider moves. This method converts the slider's float value to an integer and updates the label text to show the current volume. This way, the user sees the volume number change live as they slide.

Final Result
Completed Screen
-----------------------
| Volume Control       |
|---------------------|
| Volume: 75          |
|                     |
| [-------------O----] |
|                     |
|                     |
-----------------------
User drags the slider thumb left or right.
The volume label above updates instantly to show the new integer value.
Stretch Goal
Add a mute button below the slider that sets the volume to 0 and updates the label.
💡 Hint
Add a UIButton, place it below the slider, and connect its action to set slider.value = 0 and update the label.

Practice

(1/5)
1. What is the main purpose of a UISlider in an iOS app?
easy
A. To navigate between different screens
B. To display a list of items for selection
C. To show a pop-up alert message
D. To let users select a value by sliding a thumb along a track

Solution

  1. Step 1: Understand UISlider functionality

    A UISlider allows users to pick a value by moving a thumb control along a horizontal track.
  2. Step 2: Compare with other UI elements

    Other options like lists, alerts, or navigation do not involve sliding to select a value.
  3. Final Answer:

    To let users select a value by sliding a thumb along a track -> Option D
  4. Quick Check:

    UISlider = sliding value selector [OK]
Hint: UISlider is for sliding to pick a value [OK]
Common Mistakes:
  • Confusing UISlider with UITableView or UIAlertController
  • Thinking UISlider navigates screens
  • Assuming UISlider shows messages
2. Which of the following is the correct way to create a UISlider in Swift?
easy
A. let slider = UISlider()
B. let slider = Slider()
C. let slider = UISlider.new()
D. let slider = createSlider()

Solution

  1. Step 1: Recall UISlider initialization syntax

    In Swift, UI elements like UISlider are created by calling their initializer with parentheses, e.g., UISlider().
  2. Step 2: Check other options

    Options B, C, and D use incorrect syntax or non-existent methods for UISlider creation.
  3. Final Answer:

    let slider = UISlider() -> Option A
  4. Quick Check:

    Correct UISlider init = let slider = UISlider() [OK]
Hint: Use class name with parentheses to create UI elements [OK]
Common Mistakes:
  • Using wrong class name like Slider
  • Trying to call .new() which is not Swift syntax
  • Using undefined functions like createSlider()
3. What will be printed when the slider value changes in this code?
let slider = UISlider()
slider.minimumValue = 0
slider.maximumValue = 10
slider.value = 5
slider.addTarget(self, action: #selector(valueChanged), for: .valueChanged)

@objc func valueChanged(_ sender: UISlider) {
    print("Value: \(sender.value)")
}
// User moves slider thumb to 7.5
medium
A. Value: 5
B. Value: 10
C. Value: 7.5
D. No output printed

Solution

  1. Step 1: Understand slider initial and changed values

    The slider starts at 5 but the user moves it to 7.5, so the value changes to 7.5.
  2. Step 2: Check the action method output

    The valueChanged method prints the current slider value, which is 7.5 after the user moves it.
  3. Final Answer:

    Value: 7.5 -> Option C
  4. Quick Check:

    Slider value after move = 7.5 [OK]
Hint: Slider value prints current position on change [OK]
Common Mistakes:
  • Assuming value stays at initial 5
  • Printing maximumValue instead of current value
  • Forgetting to connect action to valueChanged
4. Identify the error in this Swift code for UISlider:
let slider = UISlider()
slider.minimumValue = 0
slider.maximumValue = 100
slider.value = 50
slider.addTarget(self, action: #selector(sliderChanged), for: .valueChanged)

func sliderChanged() {
    print("Slider moved")
}
medium
A. UISlider cannot be created without a frame
B. The sliderChanged method must have a parameter for the sender
C. minimumValue and maximumValue must be integers
D. addTarget method is missing the event type

Solution

  1. Step 1: Check method signature for target-action

    The action method for UISlider must accept the sender parameter (usually UISlider) to match the selector signature.
  2. Step 2: Verify other parts

    minimumValue and maximumValue are Float, so integers are allowed as they convert. UISlider can be created without frame in code. addTarget includes event type .valueChanged correctly.
  3. Final Answer:

    The sliderChanged method must have a parameter for the sender -> Option B
  4. Quick Check:

    Action method needs sender parameter [OK]
Hint: Action methods need sender parameter for UIControl events [OK]
Common Mistakes:
  • Omitting sender parameter in action method
  • Thinking min/max must be Int instead of Float
  • Assuming UISlider requires frame on creation
  • Missing event type in addTarget
5. You want to create a UISlider that only allows values between 1 and 5, starting at 3, and prints "Selected: x" whenever the value changes. Which code snippet correctly implements this behavior?
hard
A. let slider = UISlider() slider.minimumValue = 1 slider.maximumValue = 5 slider.value = 3 slider.addTarget(self, action: #selector(valueChanged(_:)), for: .valueChanged) @objc func valueChanged(_ sender: UISlider) { print("Selected: \(sender.value)") }
B. let slider = UISlider() slider.minValue = 1 slider.maxValue = 5 slider.currentValue = 3 slider.addTarget(self, action: #selector(valueChanged), for: .touchUpInside) func valueChanged() { print("Selected: \(slider.value)") }
C. let slider = UISlider(frame: CGRect(x: 0, y: 0, width: 100, height: 20)) slider.minimumValue = 0 slider.maximumValue = 10 slider.value = 3 slider.addTarget(self, action: #selector(valueChanged(_:)), for: .valueChanged) @objc func valueChanged(_ sender: UISlider) { print("Selected: \(sender.value)") }
D. let slider = UISlider() slider.minimumValue = 1 slider.maximumValue = 5 slider.value = 3 slider.addTarget(self, action: #selector(valueChanged), for: .valueChanged) @objc func valueChanged() { print("Selected: \(slider.value)") }

Solution

  1. Step 1: Check slider range and initial value

    let slider = UISlider() slider.minimumValue = 1 slider.maximumValue = 5 slider.value = 3 slider.addTarget(self, action: #selector(valueChanged(_:)), for: .valueChanged) @objc func valueChanged(_ sender: UISlider) { print("Selected: \(sender.value)") } sets minimumValue to 1, maximumValue to 5, and initial value to 3, matching the requirements.
  2. Step 2: Verify target-action and method signature

    let slider = UISlider() slider.minimumValue = 1 slider.maximumValue = 5 slider.value = 3 slider.addTarget(self, action: #selector(valueChanged(_:)), for: .valueChanged) @objc func valueChanged(_ sender: UISlider) { print("Selected: \(sender.value)") } uses .valueChanged event and an action method with sender parameter, correctly printing the slider's current value.
  3. Step 3: Identify errors in other options

    let slider = UISlider() slider.minValue = 1 slider.maxValue = 5 slider.currentValue = 3 slider.addTarget(self, action: #selector(valueChanged), for: .touchUpInside) func valueChanged() { print("Selected: \(slider.value)") } uses incorrect property names and event type. let slider = UISlider(frame: CGRect(x: 0, y: 0, width: 100, height: 20)) slider.minimumValue = 0 slider.maximumValue = 10 slider.value = 3 slider.addTarget(self, action: #selector(valueChanged(_:)), for: .valueChanged) @objc func valueChanged(_ sender: UISlider) { print("Selected: \(sender.value)") } has wrong min/max values. let slider = UISlider() slider.minimumValue = 1 slider.maximumValue = 5 slider.value = 3 slider.addTarget(self, action: #selector(valueChanged), for: .valueChanged) @objc func valueChanged() { print("Selected: \(slider.value)") }'s action method lacks sender parameter.
  4. Final Answer:

    Option A code snippet correctly implements the behavior -> Option A
  5. Quick Check:

    Correct properties and action method = let slider = UISlider() slider.minimumValue = 1 slider.maximumValue = 5 slider.value = 3 slider.addTarget(self, action: #selector(valueChanged(_:)), for: .valueChanged) @objc func valueChanged(_ sender: UISlider) { print("Selected: \(sender.value)") } [OK]
Hint: Use minimumValue, maximumValue, and action with sender param [OK]
Common Mistakes:
  • Using wrong property names like minValue or currentValue
  • Missing sender parameter in action method
  • Using wrong control events like .touchUpInside
  • Setting incorrect min/max values
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