CtrlK
BlogDocsLog inGet started
Tessl Logo

ivan-magda/uikit-expert

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

1.23x
Quality

100%

Does it follow best practices?

Impact

96%

1.23x

Average score across 9 eval scenarios

SecuritybySnyk

Passed

No known issues

Overview
Quality
Evals
Security
Files

Evaluation results

97%

22%

ShopFlow: Multi-Screen Navigation with Branded Styling

UIKit navigation bar appearance and deep-link stack setup

Criteria
Without context
With context

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%

93%

9%

Profile Screen with Photo Strip and Collapsible Bio

UIKit lifecycle and constraint best practices in ProfileViewController

Criteria
Without context
With context

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%

100%

58%

Contacts List View Controller

Contacts list with diffable data source and type-safe cell registration

Criteria
Without context
With context

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%

88%

8%

Stopwatch Screen with Delegate Notifications and Lap Callbacks

Memory-safe Timer, delegate, and nested closure patterns

Criteria
Without context
With context

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%

100%

34%

Photo Grid: Efficient Large-Image Display

Async image loading with downsampling and cell reuse in UICollectionView

Criteria
Without context
With context

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%

92%

14%

Chat Compose Screen

Keyboard avoidance in chat compose screen

Criteria
Without context
With context

KeyboardLayoutGuide anchor

100%

100%

No keyboard notifications

60%

100%

followsUndockedKeyboard

73%

100%

Setup in viewDidLoad

100%

100%

translatesAutoresizingMaskIntoConstraints

100%

100%

NSLayoutConstraint.activate

33%

46%

100%

Dashboard Container: Embed and Swap Panels

Child VC containment order and removal

Criteria
Without context
With context

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%

100%

News Feed View Controller

Async Task lifecycle management in UIViewController

Criteria
Without context
With context

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%

100%

20%

Article Card View Component

Dynamic Type, dark mode, trait registration, VoiceOver, and CADisplayLink weak proxy in a UIView subclass

Criteria
Without context
With context

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%

Evaluated
Agent
Claude Code
Model
Claude Sonnet 4.6

Table of Contents