¥
立即购买

iOS代理方法深度解析

17 浏览
1 试用
0 购买
Dec 5, 2025更新

本提示词专门针对iOS开发场景,能够深入解析代理方法的功能原理和应用场景。通过系统化的分析框架,详细阐述代理方法的设计意图、执行流程、参数含义和实际应用,帮助开发者准确理解iOS框架中的委托模式实现机制。输出内容包含技术原理说明、代码示例解析和最佳实践建议,确保技术描述的准确性和实用性,适用于iOS开发学习、代码审查和技术文档编写等多种场景。

代理方法概述

  • 方法签名:func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
  • 所属协议:UITableViewDelegate(可选方法)
  • 功能简介:当用户在表视图中选择某一行后回调,用于响应选择事件(如导航、更新界面、触发业务逻辑)。在单选模式下会伴随对之前选中行的自动取消选择(并触发 didDeselectRowAt)。

技术详解

  • 调用时机:

    • 在用户点按某一可选中行并完成一次触摸交互后调用。
    • 典型事件顺序(简化):shouldHighlightRowAt → 高亮 → willSelectRowAt → 选择发生 → (必要时)didDeselectRowAtdidSelectRowAt → 取消高亮。
    • 受下列条件影响:
      • tableView.allowsSelection == false:不会调用。
      • 若实现 tableView(_:willSelectRowAt:) 并返回 nil:选择被阻止,不会调用。
      • 多选模式(allowsMultipleSelection == true):不会自动取消之前选择,可连续触发 didSelectRowAt
      • 编辑模式(isEditing == true):仅在 allowsSelectionDuringEditing == true 时会触发。
      • VoiceOver、键盘等辅助方式选择仍会触发该回调。
    • 注意:调用 selectRow(at:animated:scrollPosition:) 进行编程式选择不会自动触发该代理方法;类似地,deselectRow(at:animated:) 也不会自动触发 didDeselectRowAt
  • 执行流程:

    • 方法在主线程上执行。
    • indexPath 对应当前数据源状态下的行位置;在单选模式下若已有选中的行,将先触发该行的 didDeselectRowAt,再触发新选中的行的 didSelectRowAt
    • 常见后续操作包括:导航到详情页、更新所选状态、触发网络请求、记录埋点等。
    • 视觉处理:通常在回调中调用 deselectRow(at:animated:) 以恢复默认的非高亮状态,符合系统交互习惯。
  • 参数解析:

    • tableView: UITableView
      • 触发事件的表视图实例。
      • 可根据该实例的配置(如 allowsMultipleSelectionisEditing)决定处理逻辑。
    • indexPath: IndexPath
      • 选中行的位置,由 sectionrow 组成。
      • 应通过该位置索引你的数据模型,而非直接依赖 cell 内容;必要时使用稳定标识(ID)而非持久化 IndexPath,避免数据变更导致的错位。
      • 若需要访问 cell,可通过 tableView.cellForRow(at:) 获取;但该方法仅对当前可见行返回非空。
  • 返回值说明:

    • 无返回值。
    • 是否允许选择应在 tableView(_:willSelectRowAt:)tableView(_:shouldHighlightRowAt:) 中控制;didSelectRowAt 仅用于“选择已发生”后的响应。

应用示例

import UIKit

// 假设有一个基于稳定标识的数据模型
struct Item: Hashable {
    let id: UUID
    let title: String
}

final class ItemsViewController: UIViewController {
    @IBOutlet private weak var tableView: UITableView!

    // 数据源:按 section 分组的二维数组(或使用 Diffable Data Source)
    private var sections: [[Item]] = []

    // 防止重复导航的状态标记
    private var isNavigating = false

    override func viewDidLoad() {
        super.viewDidLoad()

        tableView.delegate = self
        tableView.dataSource = self
        tableView.allowsSelection = true
        tableView.allowsMultipleSelection = false // 单选示例
    }

    // 根据 IndexPath 安全地获取模型
    private func item(at indexPath: IndexPath) -> Item? {
        guard sections.indices.contains(indexPath.section),
              sections[indexPath.section].indices.contains(indexPath.row) else { return nil }
        return sections[indexPath.section][indexPath.row]
    }

    // 典型的导航处理
    private func showDetail(for item: Item) {
        // 模拟耗时任务或导航
        // 真实项目可 push 到详情控制器并传入 item.id
        let detailVC = DetailViewController(itemID: item.id)
        navigationController?.pushViewController(detailVC, animated: true)
    }
}

// MARK: - UITableViewDataSource
extension ItemsViewController: UITableViewDataSource {
    func numberOfSections(in tableView: UITableView) -> Int { sections.count }
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { sections[section].count }

    func tableView(_ tableView: UITableView,
                   cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
        if let item = item(at: indexPath) {
            cell.textLabel?.text = item.title
            cell.selectionStyle = .default // 即便为 .none,didSelectRowAt 仍会被调用(若允许选择)
        }
        return cell
    }
}

// MARK: - UITableViewDelegate
extension ItemsViewController: UITableViewDelegate {

    // 可选:禁止某些行被选中(例如禁用奇数行)
    func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? {
        let isSelectable = indexPath.row % 2 == 0
        return isSelectable ? indexPath : nil
    }

    // 核心:处理选择事件
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        // 按系统规范,尽快取消高亮以获得一致的交互体验
        tableView.deselectRow(at: indexPath, animated: true)

        // 索引模型;避免直接依赖 cell 内容
        guard let item = item(at: indexPath) else { return }

        // 防抖:避免快速连续点按导致重复导航或业务逻辑重复触发
        guard !isNavigating else { return }
        isNavigating = true

        // 在主线程进行导航;耗时任务放到后台
        DispatchQueue.main.async { [weak self] in
            self?.showDetail(for: item)
            self?.isNavigating = false
        }
    }

    // 可选:多选模式下的取消选择处理(用户在单选模式切换到另一行时也会触发)
    func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
        // 更新状态或统计
    }

    // 可选:细化高亮行为(不高亮但允许选择时,可返回 false)
    func tableView(_ tableView: UITableView, shouldHighlightRowAt indexPath: IndexPath) -> Bool {
        return true
    }
}

// 示例详情控制器
final class DetailViewController: UIViewController {
    private let itemID: UUID
    init(itemID: UUID) {
        self.itemID = itemID
        super.init(nibName: nil, bundle: nil)
    }
    required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") }
}

注意事项

  • 实现要求:

    • 方法在主线程回调;UI 更新与导航需在主线程执行。
    • 始终通过 indexPath 查询数据模型,避免直接读取 cell 内容以防数据/视图不同步。
    • 若使用 UITableViewController,默认 clearsSelectionOnViewWillAppear == true 会在界面返回时自动取消选中;如需保留选中状态,将其置为 false 并自行管理。
  • 常见问题:

    • 编程式选择不触发回调:selectRow(at:animated:scrollPosition:) 不会调用 didSelectRowAt。如需统一逻辑,可在选择后手动调用处理函数或统一封装。
    • 选择被意外阻止:检查 allowsSelectionisEditingallowsSelectionDuringEditing,以及 willSelectRowAt 是否返回了 nil
    • 索引越界或数据错位:在异步刷新或使用差量更新时,indexPath 在回调后可能变得无效。应使用稳定 ID(如模型主键)驱动导航与业务。
    • 重复触发:快速连续点按会多次调用。加入防抖或在处理期间禁用交互。
  • 最佳实践:

    • didSelectRowAt 中调用 tableView.deselectRow(at:animated:),使交互与系统一致。
    • 保持回调内逻辑轻量,将耗时操作(网络请求、复杂计算)转移到后台队列;仅在主线程回写 UI。
    • 使用 willSelectRowAt/shouldHighlightRowAt 定制选择策略:前者控制“能否选中”,后者控制“是否高亮”。
    • 在单选切换时,考虑 didDeselectRowAt 做状态同步(如复选 UI 或统计)。
    • 若使用 Diffable Data Source,导航应基于项的标识而非 IndexPath,以应对快照更新带来的行位置变化。

代理方法概述

  • 方法签名:func urlSession(_ session: URLSession, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void)
  • 所属协议:URLSessionDelegate
  • 功能简介:处理会话层(Session-level)的网络认证挑战,包括服务器信任(TLS/SSL)、HTTP 基本/摘要认证、代理认证、客户端证书等。当某个任务未实现任务级认证回调或挑战属于会话范围时,系统调用该方法让开发者决定如何应对认证挑战。

技术详解

  • 调用时机:

    • 当网络连接过程中遇到认证挑战时调用,例如:
      • TLS 握手时的服务器信任校验(NSURLAuthenticationMethodServerTrust)。
      • 收到 401/407 等需要身份验证的响应时(HTTP Basic/Digest、代理认证)。
      • 服务器请求客户端证书(NSURLAuthenticationMethodClientCertificate)。
    • 优先级:若实现了 URLSessionTaskDelegate.urlSession(_:task:didReceive:completionHandler:),系统会优先调用任务级方法;否则调用本会话级方法。若两者都未实现,则走系统默认处理(可能使用 URLCredentialStorage 或 ATS 的默认信任策略)。
    • 适用于默认、后台、临时(ephemeral)等会话配置。后台会话中如需认证,必须由委托处理,否则任务可能失败。
  • 执行流程:

    1. 系统构造 URLAuthenticationChallenge,携带保护域(protectionSpace)、建议凭据(proposedCredential)、之前失败次数(previousFailureCount)等信息。
    2. 调用该代理方法,将控制权交给应用。
    3. 你必须调用 completionHandler 一次,指定处理策略(AuthChallengeDisposition)以及相应的凭据(如需要)。
    4. 系统根据你的指示继续、取消或改变认证流程。若提供凭据失败,系统可能再次触发挑战并增加 previousFailureCount
  • 参数解析:

    • session:当前触发挑战的会话实例。用于区分不同 URLSession 的策略或状态。
    • challenge:认证挑战的详细信息对象。
      • protectionSpace:认证范围与方法。
        • authenticationMethod:常见值包括:
          • NSURLAuthenticationMethodServerTrust(服务器信任/证书)
          • NSURLAuthenticationMethodHTTPBasicNSURLAuthenticationMethodHTTPDigest
          • NSURLAuthenticationMethodNTLMNSURLAuthenticationMethodNegotiate(Kerberos)
          • NSURLAuthenticationMethodClientCertificate(客户端证书)
        • 其它字段:hostportrealmisProxyprotocolserverTrustSecTrust?)在服务器信任挑战中提供。
      • proposedCredential:系统建议使用的凭据(可能来自 URLCredentialStorage)。
      • previousFailureCount:之前失败的次数,用于避免无限重试。
      • failureResponse/error:上次失败的响应或错误(如有)。
    • completionHandler:回调,必须调用一次,传入处理策略与可选凭据。
      • URLSession.AuthChallengeDisposition
        • .useCredential:使用传入的 URLCredential 继续。
        • .performDefaultHandling:交给系统默认处理(ATS/证书信任、凭据存储等)。
        • .cancelAuthenticationChallenge:取消挑战,通常导致请求失败。
        • .rejectProtectionSpace:拒绝当前保护域,让系统尝试其它可用的认证方法(若有)。
  • 返回值说明:

    • 方法本身无返回值。通过 completionHandler 的参数决定后续行为。
    • URLCredential 的常见构造:
      • URLCredential(trust: SecTrust):服务器信任通过。
      • URLCredential(user:password:persistence:):HTTP 基本/摘要认证。
      • URLCredential(identity:certificates:persistence:):客户端证书(SecIdentity + 证书链)。

应用示例

import Foundation
import Security

final class SessionAuthDelegate: NSObject, URLSessionDelegate {

    // 在会话层处理认证挑战(服务器证书信任 + HTTP Basic)
    func urlSession(_ session: URLSession,
                    didReceive challenge: URLAuthenticationChallenge,
                    completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {

        let method = challenge.protectionSpace.authenticationMethod

        switch method {
        case NSURLAuthenticationMethodServerTrust:
            // TLS 服务器信任(可选:证书/公钥固定)
            guard let serverTrust = challenge.protectionSpace.serverTrust else {
                completionHandler(.cancelAuthenticationChallenge, nil)
                return
            }

            // 先按系统策略评估(ATS)
            var trustError: CFError?
            let isTrustedBySystem = SecTrustEvaluateWithError(serverTrust, &trustError)

            // 如果你不做固定(pinning),通常选择系统默认处理更安全
            // completionHandler(.performDefaultHandling, nil); return

            // 示例:证书固定(pinning)
            // 将服务端叶子证书与应用内打包的证书(DER)比较
            if isTrustedBySystem,
               let serverCert = SecTrustGetCertificateAtIndex(serverTrust, 0) {
                let serverCertData = SecCertificateCopyData(serverCert) as Data

                // 从 Bundle 读取已知的服务器证书(myserver.cer)
                guard let certURL = Bundle.main.url(forResource: "myserver", withExtension: "cer"),
                      let pinnedCertData = try? Data(contentsOf: certURL) else {
                    completionHandler(.cancelAuthenticationChallenge, nil)
                    return
                }

                if serverCertData == pinnedCertData {
                    // 证书匹配,接受该连接
                    let credential = URLCredential(trust: serverTrust)
                    completionHandler(.useCredential, credential)
                } else {
                    // 不匹配,拒绝连接(或 .rejectProtectionSpace 视策略而定)
                    completionHandler(.cancelAuthenticationChallenge, nil)
                }
            } else {
                // 系统信任评估失败,直接取消
                completionHandler(.cancelAuthenticationChallenge, nil)
            }

        case NSURLAuthenticationMethodHTTPBasic, NSURLAuthenticationMethodHTTPDigest:
            // HTTP 基本/摘要认证(401)
            // 若系统已有建议凭据(可能来自 URLCredentialStorage),优先使用
            if let proposed = challenge.proposedCredential {
                completionHandler(.useCredential, proposed)
                return
            }

            // 示例:提供应用内保存的用户名/密码
            let username = "user@example.com" // 从安全存储(Keychain)读取
            let password = "securePassword"   // 从安全存储(Keychain)读取

            // 防止无限重试:如果已经失败过,直接取消或提示用户
            if challenge.previousFailureCount > 0 {
                completionHandler(.cancelAuthenticationChallenge, nil)
                return
            }

            let credential = URLCredential(user: username,
                                           password: password,
                                           persistence: .forSession)
            completionHandler(.useCredential, credential)

        case NSURLAuthenticationMethodClientCertificate:
            // 客户端证书(双向 TLS)
            // 需要从 Keychain 读取 SecIdentity 和证书链
            // 这里只示意默认处理
            completionHandler(.performDefaultHandling, nil)

        default:
            // 其它方法(NTLM/Kerberos/代理等),如果未特殊处理,交由系统默认
            completionHandler(.performDefaultHandling, nil)
        }
    }
}

// 使用示例:创建 URLSession 并发起请求
let config = URLSessionConfiguration.default
// 可选:开启/配置凭据存储
config.urlCredentialStorage = URLCredentialStorage.shared

let session = URLSession(configuration: config, delegate: SessionAuthDelegate(), delegateQueue: nil)
let url = URL(string: "https://api.example.com/secure")!
let task = session.dataTask(with: url) { data, response, error in
    // 处理响应
}
task.resume()

注意事项

  • 实现要求:

    • 必须且仅调用一次 completionHandler,否则请求会挂起或导致崩溃风险。
    • 方法在会话的委托队列上调用,避免在回调中执行耗时阻塞操作。
    • 对于后台会话(URLSessionConfiguration.background),需要在代理中正确处理认证,否则任务可能失败。
  • 常见问题:

    • 无限重试:未检查 previousFailureCount,在错误凭据下不断提供同一凭据,导致循环。应在失败后取消或提示用户。
    • 证书固定失效:服务端更新证书后,固定到具体证书的策略会导致连接失败。可考虑固定公钥或中间 CA 并准备平滑更新方案。
    • 忽略系统信任:直接跳过 SecTrustEvaluateWithError 可能绕过 ATS 规则,降低安全性。建议先进行系统评估,再做自定义策略。
    • 未使用安全存储:将用户名/密码明文保存在用户默认或内存中存在安全隐患,应使用 Keychain。
  • 最佳实践:

    • 优先使用 .performDefaultHandling 与系统信任策略,只有在确有需求时才进行证书/公钥固定。
    • 对 Basic/Digest 认证,优先使用 challenge.proposedCredential,结合 URLCredentialStorage 管理凭据,减少重复输入与错误率。
    • 对证书固定,尽量固定公钥而非整张证书,并为证书轮换设计回退机制(例如允许多份有效指纹列表)。
    • 在实现任务级与会话级挑战处理时,明确职责:任务级用于特定请求需求,会话级用于通用策略与兜底处理。

代理方法概述

  • 方法签名:func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool)
  • 所属协议:UIScrollViewDelegate
  • 功能简介:当用户手指结束拖拽(抬起)滚动视图时被调用。通过 decelerate 参数告知接下来是否会继续以惯性减速滚动,从而决定是否立即执行某些操作或等待减速结束。

技术详解

  • 调用时机:

    • 用户开始拖拽:scrollViewWillBeginDragging(_:)
    • 拖拽过程中:多次触发 scrollViewDidScroll(_:)
    • 将结束拖拽(可调整目标停靠位置):scrollViewWillEndDragging(_:withVelocity:targetContentOffset:)
    • 结束拖拽(当前方法):scrollViewDidEndDragging(_:willDecelerate:)
    • 若 decelerate 为 true:随后触发 scrollViewWillBeginDecelerating(:) → scrollViewDidEndDecelerating(:)
    • 若 decelerate 为 false:不会进入减速阶段,内容立即停止(除非你主动触发动画滚动)
  • 执行流程:

    • 用户抬手后立刻回调本方法。
    • 根据 decelerate 判断:
      • true:滚动将继续减速,不要立刻做重型任务,通常等待 didEndDecelerating 再做。
      • false:滚动已停止,可立即执行与“滚动结束”相关的逻辑(比如加载数据、恢复渲染)。
  • 参数解析:

    • scrollView:触发回调的 UIScrollView 实例(包含 UITableView、UICollectionView)。
    • decelerate:
      • true:用户有抛掷动作或存在弹性回弹,将继续以惯性减速。
      • false:无后续减速,滚动已就地停止。
  • 返回值说明:

    • 无返回值。该回调用于获知状态与时机,以执行相应副作用逻辑。

应用示例

import UIKit

final class ListViewController: UIViewController {
    @IBOutlet weak var tableView: UITableView!

    // 用于控制滚动时的资源消耗(如图片加载、复杂布局计算)
    private var isScrollingHeavily = false

    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.delegate = self   // UITableViewDelegate 继承自 UIScrollViewDelegate
        tableView.dataSource = self
    }

    private func resumeHeavyWorkIfNeeded() {
        guard isScrollingHeavily else { return }
        isScrollingHeavily = false
        // 恢复图片解码/渲染、启动数据请求等
    }

    private func pauseHeavyWork() {
        isScrollingHeavily = true
        // 暂停图片解码/渲染、延迟耗时计算等
    }

    private func isNearBottom(of scrollView: UIScrollView, threshold: CGFloat = 100) -> Bool {
        let contentOffsetBottom = scrollView.contentOffset.y + scrollView.bounds.height
        return contentOffsetBottom > (scrollView.contentSize.height - threshold)
    }

    private func loadMoreIfNeeded(_ scrollView: UIScrollView) {
        guard isNearBottom(of: scrollView) else { return }
        // 触发“加载更多”,避免在减速期间触发,减少卡顿
        // loadMoreData()
    }
}

extension ListViewController: UITableViewDelegate, UITableViewDataSource {
    // 数据源实现略

    func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
        pauseHeavyWork()
    }

    func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
        if decelerate {
            // 等待减速结束再恢复重任务,避免掉帧
        } else {
            // 已停止:可恢复任务并做与“滚动结束”相关的操作
            resumeHeavyWorkIfNeeded()
            loadMoreIfNeeded(scrollView)
        }
    }

    func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
        // 减速结束:此时真正停止
        resumeHeavyWorkIfNeeded()
        loadMoreIfNeeded(scrollView)
    }
}

注意事项

  • 实现要求:

    • 方法是可选的,确保 delegate 已正确设置;对 UITableView/UICollectionView,直接在其 delegate 中实现即可。
    • 回调发生在主线程,避免在其中执行大量同步耗时任务。
  • 常见问题:

    • 在减速期间做重型工作导致滚动掉帧:应在 decelerate 为 false 或 didEndDecelerating 中执行。
    • 误以为 “轻点不拖动” 也会触发:只有实际发生拖拽并抬手才会调用。
    • 与 scrollViewWillEndDragging 混淆:前者用于预测并可修改目标停靠位置;本方法用于“拖拽结束”的状态通知,不能修改停靠位置。
  • 最佳实践:

    • 将“暂停/恢复耗时操作”的逻辑分流:开始拖拽暂停,拖拽结束根据 decelerate 决定立即或延后恢复。
    • “加载更多/曝光统计”等需要稳定位置的逻辑,放在 decelerate 为 false 或 didEndDecelerating。
    • 保持回调内逻辑轻量,必要时只设置标记或调度异步任务,以保证滚动流畅度。

示例详情

解决的问题

用一次输入,快速生成“从原理到落地”的 iOS 代理方法深度解析,覆盖学习、开发、代码评审、技术文档与面试准备等全链路场景。通过标准化的结构输出与可控的技术深度,帮助个人与团队:

  • 快速看懂每个代理方法的作用、时机、参数与返回值影响
  • 直接获得可复用的代码示例与最佳实践,减少试错与返工
  • 将零散经验沉淀为可共享的知识资产,统一团队认知与表达
  • 显著缩短文档撰写与评审沟通时间,提升交付质量与效率

适用用户

iOS初中级开发者

借助本提示词,快速搞懂代理方法的触发时机与参数意义,基于示例完成正确实现,并整理为可复用的个人笔记与代码片段。

资深工程师与代码审查负责人

批量解析关键代理方法,核对实现是否覆盖必要边界与异常路径,输出评审意见与最佳实践清单,推动团队统一规范落地。

技术文档撰写者

一键生成条理清晰的说明、示例与注意事项,直接用于项目Wiki与对外文档,显著缩短资料整理与校对时间。

特征总结

一键解析指定代理方法的作用与触发时机,快速厘清边界,杜绝误用与重复实现
自动逐项讲解参数含义与返回值影响,给出可直接套用的判断与处理建议
结合真实业务场景提供Swift示例与注释,上手即用,减少查资料与试错时间
按需调节技术深度与呈现结构,兼顾学习笔记、代码评审与团队规范输出
自动梳理调用流程与前后条件,明确依赖关系与边界约束,降低联调风险
提炼最佳实践与常见坑点清单,给出替代做法与取舍理由,提升代码稳定性
支持批量方法解析与统一格式导出,适配项目Wiki与知识库沉淀与复用
面向面试与复盘场景,自动生成问答要点与追问思路,快速形成个人话术库
结合性能与可维护性角度给出取舍建议,帮助做出更稳妥的实现与选型

如何使用购买的提示词模板

1. 直接在外部 Chat 应用中使用

将模板生成的提示词复制粘贴到您常用的 Chat 应用(如 ChatGPT、Claude 等),即可直接对话使用,无需额外开发。适合个人快速体验和轻量使用场景。

2. 发布为 API 接口调用

把提示词模板转化为 API,您的程序可任意修改模板参数,通过接口直接调用,轻松实现自动化与批量处理。适合开发者集成与业务系统嵌入。

3. 在 MCP Client 中配置使用

在 MCP client 中配置对应的 server 地址,让您的 AI 应用自动调用提示词模板。适合高级用户和团队协作,让提示词在不同 AI 工具间无缝衔接。

AI 提示词价格
¥20.00元
先用后买,用好了再付款,超安全!

您购买后可以获得什么

获得完整提示词模板
- 共 757 tokens
- 3 个可调节参数
{ 代理方法名称 } { 技术深度级别 } { 输出格式偏好 }
获得社区贡献内容的使用权
- 精选社区优质案例,助您快速上手提示词
使用提示词兑换券,低至 ¥ 9.9
了解兑换券 →
限时半价

不要错过!

半价获取高级提示词-优惠即将到期

17
:
23
小时
:
59
分钟
:
59