Token导航 LogoToken导航TokenDH.com
研究检索权限需确认github未标认证来源可访问clear审计未展示

debug_swiftui调试 swiftui

Agent Skill

debug_swiftui 用于查找、检索和筛选相关信息,适合在 Codex、Claude、Cursor、Gemini CLI 中需要根据关键词、任务场景或来源线索快速定位候选结果时使用。可结合来源仓库、安装命令和原始 README 继续核验具体用法。安装前建议确认权限范围、维护状态,以及是否会触发联网、命令执行或文件读写。

总安装

998

周安装

40

GitHub Stars

公开资料未说明

下载量

323
CodexClaudeCursorGemini CLI

安装说明

本站只整理中文说明和来源信息,不托管安装包,也不代用户安装。

GitHub

来源数

2

许可证

MIT

最后核验

2026-05-01

来源状态

来源可访问

安装方式

通过对话安装

复制提示词发给支持本地命令或 Skills 的 AI 助手,先确认命令和权限,再让它执行。

请帮我安装这个 Agent Skill:debug_swiftui(调试 swiftui)
来源仓库:https://github.com/snakeo/claude-debug-and-refactor-skills-plugin
仓库路径:skills/debug_swiftui
安装命令:
npx skills add snakeo/claude-debug-and-refactor-skills-plugin --skill "debug:swiftui"
安装前请先检查当前环境是否支持对应 CLI,并向我确认将要执行的命令、安装目录、联网范围和文件读写权限;确认后再执行。

命令行安装

复制命令到本机终端执行。该命令会通过 npx skills 从第三方来源获取 Skill;本站只展示命令,不托管安装包,也不自动执行。

AgentSkills.tonpx skills
npx skills add snakeo/claude-debug-and-refactor-skills-plugin --skill "debug:swiftui"

简介

debug_swiftui 提供 SwiftUI iOS/macOS 应用的调试支持。

  • 适用于声明式 UI 和原生组件开发分析。
  • 需确认 Xcode 项目和模拟器配置。debug_swiftui 属于研究检索类 Skill,可作为该场景下的辅助能力补充。
  • 涉及真机调试时,应区分开发证书与发布环境。
  • 建议结合 Instruments 工具验证性能与内存使用。

SKILL.md

SwiftUI Debugging Guide

A comprehensive guide for systematically debugging SwiftUI applications, covering common error patterns, debugging tools, and step-by-step resolution strategies.

Common Error Patterns

1. View Not Updating

Symptoms:

  • UI doesn't reflect state changes
  • Data updates but view remains stale
  • Animations don't trigger

Root Causes:

  • Missing @Published on ObservableObject properties
  • Using wrong property wrapper (@State vs @Binding vs @ObservedObject)
  • Mutating state on background thread
  • Object reference not triggering SwiftUI's change detection

Solutions:

// Ensure @Published is used for observable properties
class ViewModel: ObservableObject {
    @Published var items: [Item] = []  // Correct
    var count: Int = 0  // Won't trigger updates
}

// Force view refresh with id modifier
List(items) { item in
    ItemRow(item: item)
}
.id(UUID())  // Forces complete rebuild

// Update state on main thread
DispatchQueue.main.async {
    self.viewModel.items = newItems
}

2. @State/@Binding Issues

Symptoms:

  • Child view changes don't propagate to parent
  • State resets unexpectedly
  • Two-way binding doesn't work

Solutions:

// Parent view
struct ParentView: View {
    @State private var isOn = false

    var body: some View {
        ChildView(isOn: $isOn)  // Pass binding with $
    }
}

// Child view
struct ChildView: View {
    @Binding var isOn: Bool  // Use @Binding, not @State

    var body: some View {
        Toggle("Toggle", isOn: $isOn)
    }
}

3. NavigationStack Problems

Symptoms:

  • Navigation doesn't work
  • Back button missing
  • Destination view not appearing
  • Deprecated NavigationView warnings

Solutions:

// iOS 16+ use NavigationStack
NavigationStack {
    List(items) { item in
        NavigationLink(value: item) {
            Text(item.name)
        }
    }
    .navigationDestination(for: Item.self) { item in
        DetailView(item: item)
    }
}

// For programmatic navigation
@State private var path = NavigationPath()

NavigationStack(path: $path) {
    // ...
}

// Navigate programmatically
path.append(item)

4. Memory Leaks with Closures

Symptoms:

  • Memory usage grows over time
  • Deinit never called
  • Retain cycles in view models

Solutions:

// Use [weak self] in closures
viewModel.fetchData { [weak self] result in
    guard let self = self else { return }
    self.handleResult(result)
}

// For Combine subscriptions, store cancellables
private var cancellables = Set<AnyCancellable>()

publisher
    .sink { [weak self] value in
        self?.handleValue(value)
    }
    .store(in: &cancellables)

5. Preview Crashes

Symptoms:

  • Canvas shows "Preview crashed"
  • "Cannot preview in this file"
  • Slow or unresponsive previews

Solutions:

// Provide mock data for previews
#Preview {
    ContentView()
        .environmentObject(MockViewModel())
}

// Use @available to exclude preview-incompatible code
#if DEBUG
struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
            .previewDevice("iPhone 15 Pro")
    }
}
#endif

// Simplify preview environment
#Preview {
    ContentView()
        .modelContainer(for: Item.self, inMemory: true)
}

6. Combine Publisher Issues

Symptoms:

  • Publisher never emits
  • Multiple subscriptions
  • Memory leaks
  • Values emitted on wrong thread

Solutions:

// Ensure receiving on main thread for UI updates
publisher
    .receive(on: DispatchQueue.main)
    .sink { value in
        self.updateUI(value)
    }
    .store(in: &cancellables)

// Debug publisher chain
publisher
    .print("DEBUG")  // Prints all events
    .handleEvents(
        receiveSubscription: { _ in print("Subscribed") },
        receiveOutput: { print("Output: \($0)") },
        receiveCompletion: { print("Completed: \($0)") },
        receiveCancel: { print("Cancelled") }
    )
    .sink { _ in }
    .store(in: &cancellables)

7. Compiler Type-Check Errors

Symptoms:

  • "The compiler is unable to type-check this expression in reasonable time"
  • Generic error messages on wrong line
  • Build times extremely slow

Solutions:

// Break complex views into smaller components
// BAD: Complex inline logic
var body: some View {
    VStack {
        if condition1 && condition2 || condition3 {
            // Lots of nested views...
        }
    }
}

// GOOD: Extract to computed properties or subviews
var body: some View {
    VStack {
        conditionalContent
    }
}

@ViewBuilder
private var conditionalContent: some View {
    if shouldShowContent {
        ContentSubview()
    }
}

8. Animation Issues

Symptoms:

  • Animations not playing
  • Jerky or stuttering animations
  • Wrong elements animating

Solutions:

// Use withAnimation for explicit control
Button("Toggle") {
    withAnimation(.spring()) {
        isExpanded.toggle()
    }
}

// Apply animation to specific value
Rectangle()
    .frame(width: isExpanded ? 200 : 100)
    .animation(.easeInOut, value: isExpanded)

// Use transaction for fine-grained control
var transaction = Transaction(animation: .easeInOut)
transaction.disablesAnimations = false
withTransaction(transaction) {
    isExpanded.toggle()
}

Debugging Tools

Xcode Debugger

Breakpoints:

// Conditional breakpoint
// Right-click breakpoint > Edit Breakpoint > Condition: items.count > 10

// Symbolic breakpoint for SwiftUI layout issues
// Debug > Breakpoints > Create Symbolic Breakpoint
// Symbol: UIViewAlertForUnsatisfiableConstraints

LLDB Commands:

# Print view hierarchy
po view.value(forKey: "recursiveDescription")

# Print SwiftUI view
po self

# Examine memory
memory read --size 8 --format x 0x12345678

# Find retain cycles
leaks --outputGraph=/tmp/leaks.memgraph [PID]

Instruments

Allocations:

  • Track memory usage over time
  • Identify objects not being deallocated
  • Find retain cycles

Time Profiler:

  • Identify slow code paths
  • Find main thread blocking
  • Optimize view rendering

SwiftUI Instruments (Xcode 15+):

  • View body evaluations
  • View identity tracking
  • State change tracking

Print Debugging

// Track view redraws
var body: some View {
    let _ = Self._printChanges()  // Prints what caused redraw
    Text("Hello")
}

// Conditional debug printing
#if DEBUG
func debugPrint(_ items: Any...) {
    print(items)
}
#else
func debugPrint(_ items: Any...) {}
#endif

// os_log for structured logging
import os.log

let logger = Logger(subsystem: "com.app.name", category: "networking")
logger.debug("Request started: \(url)")
logger.error("Request failed: \(error.localizedDescription)")

View Hierarchy Debugger

  1. Run app in simulator/device
  2. Click "Debug View Hierarchy" button in Xcode
  3. Use 3D view to inspect layer structure
  4. Check for overlapping views, incorrect frames

Environment Inspection

// Print all environment values
struct DebugEnvironmentView: View {
    @Environment(\.self) var environment

    var body: some View {
        let _ = print(environment)
        Text("Debug")
    }
}

The Four Phases (SwiftUI-Specific)

Phase 1: Reproduce and Isolate

  1. Create minimal reproduction

- Strip away unrelated code - Use fresh SwiftUI project if needed - Test in Preview vs Simulator vs Device

  1. Identify trigger conditions

- When does the bug occur? - What user actions trigger it? - Is it state-dependent?

  1. Check iOS version specifics

- Does it happen on all iOS versions? - Is it simulator-only or device-only?

Phase 2: Diagnose

  1. Use Self._printChanges() var body: some View {let _ = Self._printChanges() // Your view content}
  2. Add strategic breakpoints

- Body property - State mutations - Network callbacks

  1. Check property wrapper usage

- @State for view-local state - @Binding for parent-child communication - @StateObject for owned ObservableObject - @ObservedObject for passed ObservableObject - @EnvironmentObject for dependency injection

  1. Verify threading // Check if on main thread assert(Thread.isMainThread, "Must be on main thread")

Phase 3: Fix

  1. Apply targeted fix

- Fix one issue at a time - Don't introduce new property wrappers unnecessarily

  1. Test the fix

- Verify in Preview - Test in Simulator - Test on physical device - Test edge cases

  1. Check for side effects

- Run existing tests - Verify related features still work

Phase 4: Prevent

  1. Add unit tests func testViewModelUpdatesState() async {let viewModel = ViewModel() await viewModel.fetchData() XCTAssertEqual(viewModel.items.count, 10)}
  2. Add UI tests func testNavigationFlow() {let app = XCUIApplication() app.launch() app.buttons["DetailButton"].tap() XCTAssertTrue(app.staticTexts["DetailView"].exists)}
  3. Document the fix

- Add code comments explaining why - Update team documentation

Quick Reference Commands

Xcode Shortcuts

ShortcutAction
Cmd + RRun
Cmd + BBuild
Cmd + URun tests
Cmd + Shift + KClean build folder
Cmd + Option + PResume preview
Cmd + 7Show debug navigator
Cmd + 8Show breakpoint navigator

Common Debug Snippets

// Force view identity reset
.id(someValue)

// Track view lifecycle
.onAppear { print("View appeared") }
.onDisappear { print("View disappeared") }
.task { print("Task started") }

// Debug layout
.border(Color.red)  // See frame boundaries
.background(Color.blue.opacity(0.3))

// Debug geometry
.background(GeometryReader { geo in
    Color.clear.onAppear {
        print("Size: \(geo.size)")
        print("Frame: \(geo.frame(in: .global))")
    }
})

// Debug state changes
.onChange(of: someState) { oldValue, newValue in
    print("State changed from \(oldValue) to \(newValue)")
}

Build Settings for Debugging

// In scheme > Run > Arguments > Environment Variables
OS_ACTIVITY_MODE = disable  // Reduce console noise
DYLD_PRINT_STATISTICS = 1   // Print launch time stats

Memory Debugging

// Add to class to track deallocation
deinit {
    print("\(Self.self) deinit")
}

// Enable Zombie Objects
// Edit Scheme > Run > Diagnostics > Zombie Objects

// Enable Address Sanitizer
// Edit Scheme > Run > Diagnostics > Address Sanitizer

Resources

适合场景

01

用户想查找某类 Agent Skill 时

02

需要根据任务场景推荐可安装能力包时

03

需要对比不同来源的安装命令和来源信息时

04

需要参考平台分布和安装热度时

能力概览

能力 1

按任务关键词查找相关 Skills

能力 2

展示可复制的安装命令

能力 3

保留来源站点、仓库和原始说明,方便继续核验

能力 4

补充不同宿主或平台的使用分布数据

安装后应在对应宿主中按原始 README 的触发条件使用;具体调用方式请以来源页面和 README 为准。

平台分布

OpenCode

30.13%
按下载量换算97

Claude Code

22.58%
按下载量换算73

Antigravity

16%
按下载量换算52

windsurf

12.53%
按下载量换算40

Codex

8.08%
按下载量换算26

Gemini CLI

3.64%
按下载量换算12

安全审计

暂无安全审计结果可展示。

权限和风险

权限需确认

当前来源未能明确判断权限范围,默认进入异常复核队列。

安装前确认

本站仅展示第三方公开信息,不托管安装包,不提供自动安装或运行环境。安装前应自行审查源码、依赖和命令行为。当前只有一个来源,正式发布前建议补源仓库或其他目录站核验。

来源信息

继续浏览同类 Skills