<!--
{
  "documentType" : "article",
  "framework" : "AppKit",
  "identifier" : "/documentation/AppKit/custom-controls",
  "metadataVersion" : "0.1.0",
  "role" : "collectionGroup",
  "title" : "Custom Controls"
}
-->

# Custom Controls

Support accessibility for custom user interface elements by adopting a role-specific protocol and implementing its methods.

## Discussion

Role-specific accessibility protocols represent the most common control types found in apps. Adopt a role-specific accessibility protocol if:

- You’re creating a custom control that’s a subclass of [`NSView`](/documentation/AppKit/NSView), and you want to modify the control’s behavior beyond what AppKit provides by default.
- You’re working with a specialized control that doesn’t subclass [`NSView`](/documentation/AppKit/NSView). See [`NSAccessibilityElement`](/documentation/AppKit/NSAccessibilityElement-swift.class) first.

First, identify the role-specific protocol that best matches your control’s intended behavior. For example, if your control is something that triggers actions when the user clicks it, adopt the [`NSAccessibilityButton`](/documentation/AppKit/NSAccessibilityButton) protocol.

After you select an appropriate protocol, adopt that protocol. The compiler may ask you to reimplement some of the [`NSAccessibilityProtocol`](/documentation/AppKit/NSAccessibilityProtocol) protocol’s accessor or action methods. Simply implement these methods, and your control is ready to use.

## Topics

### Buttons

[`NSAccessibilityButton`](/documentation/AppKit/NSAccessibilityButton)

A role-based protocol that declares the minimum interface necessary for an accessibility element to act as a button.

[`NSAccessibilityRadioButton`](/documentation/AppKit/NSAccessibilityRadioButton)

A role-based protocol that declares the minimum interface necessary for an accessibility element to act as a radio button.

[`NSAccessibilitySwitch`](/documentation/AppKit/NSAccessibilitySwitch)

A role-based protocol that declares the minimum interface necessary for an accessibility element to act as a switch.

[`NSAccessibilityCheckBox`](/documentation/AppKit/NSAccessibilityCheckBox)

A role-based protocol that declares the minimum interface necessary for an accessibility element to act as a checkbox.

### Value Controls

[`NSAccessibilityStepper`](/documentation/AppKit/NSAccessibilityStepper)

A role-based protocol that declares the minimum interface necessary for an accessibility element to act as a stepper.

[`NSAccessibilitySlider`](/documentation/AppKit/NSAccessibilitySlider)

A role-based protocol that declares the minimum interface necessary for an accessibility element to act as a slider.

### Groups

[`NSAccessibilityGroup`](/documentation/AppKit/NSAccessibilityGroup)

A role-based protocol that declares the minimum interface necessary to act as a container for other user interface elements.

### Lists

[`NSAccessibilityTable`](/documentation/AppKit/NSAccessibilityTable)

A role-based protocol that declares the minimum interface necessary for an accessibility element to act as a table view.

[`NSAccessibilityList`](/documentation/AppKit/NSAccessibilityList)

A role-based protocol that declares the minimum interface necessary for an accessibility element to act as a list view.

[`NSAccessibilityOutline`](/documentation/AppKit/NSAccessibilityOutline)

A role-based protocol that declares the minimum interface necessary for an accessibility element to act as an outline view.

[`NSAccessibilityRow`](/documentation/AppKit/NSAccessibilityRow)

A role-based protocol that declares the minimum interface necessary for an accessibility element to act as a row for a table, list, or outline view.

### Text

[`NSAccessibilityStaticText`](/documentation/AppKit/NSAccessibilityStaticText)

A role-based protocol that declares the minimum interface necessary for an accessibility element to act as static text.

[`NSAccessibilityNavigableStaticText`](/documentation/AppKit/NSAccessibilityNavigableStaticText)

A role-based protocol that declares the minimum interface necessary for an accessibility element to act as navigable static text.

### Images and Color

[`NSAccessibilityImage`](/documentation/AppKit/NSAccessibilityImage)

A role-based protocol that declares the minimum interface necessary for an accessibility element to act as an image.

[`NSAccessibilityColor`](/documentation/AppKit/NSAccessibilityColor)

A role-based protocol that declares the minimum interface necessary for an accessibility element to act as a color.

### Loading

[`NSAccessibilityProgressIndicator`](/documentation/AppKit/NSAccessibilityProgressIndicator)

A role-based protocol that declares the minimum interface necessary for an accessibility element to act as a progress indicator.

[`NSAccessibilityElementLoading`](/documentation/AppKit/NSAccessibilityElementLoading)

A role-based protocol that declares the minimum interface necessary for an accessibility element to support loading.

### Dynamic Elements

[`NSAccessibilityContainsTransientUI`](/documentation/AppKit/NSAccessibilityContainsTransientUI)

A role-based protocol that declares the minimum interface necessary for an accessibility element to support dynamic UI changes.

### Layout Elements

[`NSAccessibilityLayoutArea`](/documentation/AppKit/NSAccessibilityLayoutArea)

A role-based protocol that declares the minimum interface necessary for an accessibility element to act as a layout area.

[`NSAccessibilityLayoutItem`](/documentation/AppKit/NSAccessibilityLayoutItem)

A role-based protocol that declares the minimum interface necessary for an accessibility element to act as a layout item.

### Supporting Types

[`NSAccessibilityElementProtocol`](/documentation/AppKit/NSAccessibilityElementProtocol)

A role-based protocol that declares the minimum interface necessary to interact with an assistive app.



---

Copyright &copy; 2026 Apple Inc. All rights reserved. | [Terms of Use](https://www.apple.com/legal/internet-services/terms/site.html) | [Privacy Policy](https://www.apple.com/privacy/privacy-policy)