You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SwiftUI Picker中如何结合条件判断实现付费墙锁定非-1索引选项

SwiftUI Picker中如何结合条件判断实现付费墙锁定非-1索引选项

嘿,我来帮你搞定这个SwiftUI Picker的付费墙锁定需求!你想要的是只有索引-1的选项能正常使用,其他都被付费墙限制对吧?我给你整理了两个实用的方案,你可以根据自己的需求选择:

方案一:基础版(直接禁用+视觉提示)

这个方案适合简单场景,直接把非-1的选项禁用,同时加上明确的付费提示,用户一眼就知道这个选项需要解锁:

let images = ["person.slash.fill", "person.fill", "person.2.fill", "person.3.fill", "person.4.fill"]
// 注意:因为ForEach从-1开始,所以数组索引要对应i+1,避免越界

Picker("", selection: $captureDelegate.userSelectedPeopleCount) {
    ForEach(-1...4, id: \.self) { i in
        HStack(spacing: 68) {
            // 对应展示系统图标
            Image(systemName: images[i + 1])
            
            // 给非-1的选项加锁和付费提示
            if i != -1 {
                Image(systemName: "lock.fill")
                Text("付费解锁")
                    .font(.caption)
                    .foregroundColor(.gray)
            }
        }
        .tag(i)
        // 禁用所有非-1的选项
        .disabled(i != -1)
        // 二次拦截:万一禁用后还有触发点击的情况,直接唤起付费逻辑
        .onTapGesture {
            if i != -1 {
                // 这里替换成你实际的付费墙触发代码,比如弹出购买弹窗
                print("请解锁付费内容以使用该选项")
            }
        }
    }
}

这个方案简单直接,用户无法点击非-1选项,视觉上也有明确提示,不会产生歧义。

方案二:进阶版(支持订阅状态动态解锁)

如果你的App有Pro订阅功能,需要根据用户是否已付费来动态解锁选项,那可以加一个用户订阅状态的变量来控制:

// 这个变量从你的用户订阅管理类里获取,比如从UserDefaults或者后端接口
@State private var isProUser = false
let images = ["person.slash.fill", "person.fill", "person.2.fill", "person.3.fill", "person.4.fill"]

Picker("", selection: $captureDelegate.userSelectedPeopleCount) {
    ForEach(-1...4, id: \.self) { i in
        HStack(spacing: 68) {
            Image(systemName: images[i + 1])
            
            // 只有非Pro用户且不是-1的选项,才显示锁和提示
            if i != -1 && !isProUser {
                Image(systemName: "lock.fill")
                Text("付费解锁")
                    .font(.caption)
                    .foregroundColor(.gray)
            }
        }
        .tag(i)
        // 只有非Pro用户且不是-1的选项才禁用
        .disabled(i != -1 && !isProUser)
        .onTapGesture {
            if i != -1 && !isProUser {
                // 唤起付费购买流程
                print("请购买Pro版解锁该选项")
            }
        }
    }
}

这个方案灵活性更高,用户一旦购买了Pro,所有非-1的选项就会自动解锁,和普通选项一样使用。

额外的安全校验

为了防止通过某些特殊途径修改状态变量,建议在userSelectedPeopleCount的setter里加一层校验,确保未付费用户无法设置非-1的值:

var userSelectedPeopleCount: Int = -1 {
    didSet {
        // 如果用户不是Pro,且试图设置非-1的值,强行回滚
        if userSelectedPeopleCount != -1 && !isProUser {
            userSelectedPeopleCount = oldValue
            // 同时提示用户需要解锁
            print("请解锁付费内容以使用该选项")
        }
    }
}

这样就算有意外情况触发了状态修改,也能保证数据的正确性,不会出现未付费却使用付费功能的情况。

备注:内容来源于stack exchange,提问作者john smith

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 17:48:00