Write, review, or improve UIKit code following best practices for view controller lifecycle, Auto Layout, collection views, navigation, animation, memory management, and modern iOS 18–26 APIs. Use when building new UIKit features, refactoring existing views or view controllers, reviewing code quality, adopting modern UIKit patterns (diffable data sources, compositional layout, cell configuration), or bridging UIKit with SwiftUI. Does not cover SwiftUI-only code.
96
100%
Does it follow best practices?
Impact
96%
1.23xAverage score across 9 eval scenarios
Passed
No known issues
UIKit navigation bar appearance and deep-link stack setup
All 4 appearance slots set
83%
100%
Per-VC appearance on navigationItem
100%
100%
Appearance set in viewDidLoad
0%
100%
setViewControllers for deep link
100%
100%
Concurrent transition guard
100%
70%
prefersLargeTitles set once
100%
100%
largeTitleDisplayMode per VC in viewDidLoad
25%
100%
super called in lifecycle overrides
100%
100%
#available guard for iOS 26+ or iOS 15+ APIs
0%
100%
viewIsAppearing for geometry work
87%
100%
design_notes.md explains appearance strategy
100%
100%
design_notes.md explains deep-link strategy
100%
100%
UIKit lifecycle and constraint best practices in ProfileViewController
scrollToItem in viewIsAppearing
25%
100%
Setup in viewDidLoad
100%
100%
super called in all lifecycle overrides
100%
100%
translatesAutoresizingMaskIntoConstraints = false
100%
100%
NSLayoutConstraint.activate used
100%
100%
Header constraint stored and reused
100%
41%
Animation uses layoutIfNeeded on superview
100%
100%
Runtime priority ≤ 999
100%
100%
Constraint identifiers set
100%
100%
viewDidLayoutSubviews limited to layer work
0%
100%
No geometry work in viewWillAppear
100%
100%
Contacts list with diffable data source and type-safe cell registration
Stable snapshot IDs
0%
100%
CellRegistration stored property
100%
100%
No string-based dequeue
100%
100%
Initial load method
0%
100%
reconfigureItems for update
0%
100%
Compositional layout
100%
100%
UIContentConfiguration for content
0%
100%
configurationUpdateHandler for selection
0%
100%
Unique item identifiers
100%
100%
Memory-safe Timer, delegate, and nested closure patterns
Timer block-based API
100%
100%
Timer weak self capture
100%
100%
Timer invalidated in viewWillDisappear
0%
0%
deinit log statement
100%
100%
super in lifecycle overrides
100%
100%
Delegate AnyObject constraint
100%
100%
Delegate stored as weak
100%
100%
Escaping closures use [weak self]
100%
100%
Nested closure re-captures [weak self]
33%
100%
NotificationCenter observer removed in deinit
100%
100%
Async image loading with downsampling and cell reuse in UICollectionView
ImageIO downsampling
100%
100%
Display-size thumbnail
100%
100%
Task cancellation in prepareForReuse
100%
100%
Image cleared in prepareForReuse
100%
100%
Identity check before setting image
100%
100%
NSCache cost = decoded bytes
80%
100%
CellRegistration stored property
0%
100%
DiffableDataSource with UUID identifiers
0%
100%
No string-based cell dequeue
0%
100%
Keyboard avoidance in chat compose screen
KeyboardLayoutGuide anchor
100%
100%
No keyboard notifications
60%
100%
followsUndockedKeyboard
73%
100%
Setup in viewDidLoad
100%
100%
translatesAutoresizingMaskIntoConstraints
100%
100%
NSLayoutConstraint.activate
33%
46%
Child VC containment order and removal
addChild before addSubview
100%
100%
addSubview before didMove
100%
100%
willMove before removeFromSuperview
100%
100%
removeFromSuperview before removeFromParent
100%
100%
super in viewDidLoad
100%
100%
super in other lifecycle overrides
100%
100%
viewDidLoad for one-time setup
100%
100%
translatesAutoresizingMaskIntoConstraints = false
100%
100%
NSLayoutConstraint.activate used
100%
100%
Async Task lifecycle management in UIViewController
Task stored as property
100%
100%
Cancel in viewDidDisappear
100%
100%
isCancelled check before UI update
100%
100%
Task {} not Task.detached
100%
100%
No redundant @MainActor on VC methods
100%
100%
[weak self] in escaping closure
100%
100%
#available guard for iOS 26+ APIs
100%
100%
super called in lifecycle overrides
100%
100%
Dynamic Type, dark mode, trait registration, VoiceOver, and CADisplayLink weak proxy in a UIView subclass
Dynamic Type font API
100%
100%
adjustsFontForContentSizeCategory
100%
100%
Semantic text colors
100%
100%
Semantic background color
100%
100%
CGColor re-resolved on trait change
100%
100%
registerForTraitChanges used
0%
100%
No traitCollectionDidChange override
0%
100%
accessibilityLabel set
100%
100%
accessibilityTraits set
100%
100%
accessibilityHint set
100%
100%
Weak proxy for CADisplayLink
100%
100%
Table of Contents