关于苹果提交的坑-90168 -90173 -22421

最近提交新的版本到APPstore 一直提交不上去,经过几天的努力,踏遍所有的坑,终于提交成功,至此把自己的爬坑历程写下来给大家分享一下
在你提交版本的时候itunesconnect 的时候苹果会给提示是这个的这里写图片描述
,所以呢,我首先就是直接在Xcode中点击upload to APP Store 直接提交,然而在我苦苦等待了好久最后他给的错误是这个!这里写图片描述

我查询这个错误码,几乎所有的人给出的解决办法就是重新上传或者就是使用APPlication loader 上传,我重新上传结果还是一样一样的,于是呼,咱们就试试APPlication loader 上传,结果出现新的错误了,这里写图片描述,出现第一次的时候我以为是偶然,当出现了四五次的时候我内心是崩溃的,查资料,还是那句重新打包上传,当然还有其他人给出说这样解决:这里写图片描述
这几行的命令大概就是说你的APPlocation loader 版本太低,我给你升升级!这个可能解决部分人的问题,但是我的还是没解决,于是我就用这里写图片描述这个
查看版本是3.6 再次提交是又有新的惊喜
这里写图片描述,字面意思,打包的Xcode版本太低,于是呼升级吧。。。。。。。
经过两个多小时的升级,重新打包上传,成功!至此,总算解决了;另外附上苹果技术支持电话:4006701855
我给他们技术打电话寻求帮助的时候他给的建议是,打包上传时将之前的上传版本删除,用APPlication loader 上传,不行就退出重新登录,
建议:有问题找组织

<think>我们面对的问题:el-select多选模式下,默认绑定值是数组,但我们需要绑定字符串(用逗号分隔) 根据引用[1]和[3],我们可以通过使用计算属性或中间变量来实现数组和字符串之间的转换。 但是注意引用[4]提到的:值传递和引用传递的问题,需要避免直接修改原始数据导致的问题。 解决方案思路: 1. 我们可以使用一个中间变量(比如一个数组)来存储el-select选中的值(数组形式)。 2. 然后通过计算属性或者监听器,将这个数组转换成字符串(用逗号分隔)并同步到我们需要绑定的字符串变量上。 3. 反过来,如果字符串有变化(比如初始化时从后端获取的字符串),我们也需要将其转换成数组并赋给中间变量。 具体步骤: 假设我们有一个表单对象form,其中有一个字段tagIds,我们希望它是以逗号分隔的字符串,而el-select需要绑定一个数组。 步骤1:定义中间数组变量(例如:selectArray)和实际要提交的字符串变量(例如:form.tagIds) 步骤2:在el-select组件上绑定v-model="selectArray" 步骤3:使用watch或者计算属性来建立双向转换: - 当selectArray变化时,将其转换成字符串赋给form.tagIds - 当form.tagIds变化时(比如初始化赋值),将其拆分成数组赋给selectArray 但是注意:在初始化时,如果form.tagIds是空字符串,我们将其转换为空数组;如果是非空字符串,则用split(',')拆分成数组。 然而,直接双向watch可能会造成循环更新,所以我们可以: - 使用两个watch,分别监听selectArray和form.tagIds,并在内部进行转换,但要注意避免死循环(即当A变化触发B更新,B更新又触发A更新)。我们可以通过判断新值和旧值是否相等来避免。 或者,我们可以使用计算属性的setter和getter来实现一个中间变量,这样更优雅。 具体实现: 方案一:使用计算属性(推荐) 但是注意,计算属性本身不能直接用于v-model,因为我们需要一个可写的引用。我们可以这样: 定义计算属性: computed: { selectedArray: { get() { // 将form.tagIds字符串转换成数组 if (this.form.tagIds === '') { return []; } else { return this.form.tagIds.split(','); } }, set(value) { // 将数组转换成字符串,赋值给form.tagIds this.form.tagIds = value.join(','); } } } 然后在el-select上使用v-model="selectedArray" 这样,当选择时,setter会被调用,将数组转换成字符串赋值给form.tagIds。 当form.tagIds被外部改变(比如初始化)时,getter会返回对应的数组。 但是注意:如果form.tagIds的初始值不是字符串,或者可能是null/undefined,我们需要处理。 方案二:使用watch(如果计算属性不适用,比如在需要深度监听或者复杂逻辑时) 我们可以定义: data() { return { form: { tagIds: '' // 最终需要提交的字符串 }, selectArray: [] // 中间数组 } }, watch: { selectArray(newVal) { // 当中间数组变化,更新form.tagIds this.form.tagIds = newVal.join(','); }, 'form.tagIds'(newVal) { // 当form.tagIds变化,更新中间数组 // 注意:避免因为上面selectArray变化导致这里更新,然后又触发selectArray的更新?不会,因为newVal和当前selectArray转换后的字符串相同,但我们需要避免循环? // 将字符串转换成数组 if (newVal === '') { this.selectArray = []; } else { // 注意:如果form.tagIds被直接修改为一个新字符串,我们需要将其拆分成数组 // 但是,如果当前selectArray已经是对应的数组,那么就不需要更新,否则会触发selectArray的watch,然后又更新form.tagIds,但值不变,所以不会循环。 // 但为了避免重复拆分,我们可以先检查拆分后的数组和当前selectArray是否相同(但数组比较麻烦,我们直接更新即可,因为如果字符串没有变,那么拆分后的数组和当前selectArray是一样的,但是数组引用不同,会触发selectArray的watch?然后又会更新form.tagIds?) // 所以我们需要判断拆分后的数组和当前selectArray是否相等(按值比较),如果相等就不更新,避免循环。 // 简单做法:先拆分,然后比较字符串(因为数组顺序一致,所以可以比较字符串表示) let arr = newVal.split(','); if (JSON.stringify(arr) !== JSON.stringify(this.selectArray)) { this.selectArray = arr; } } } } 但是这种方法在初始化时,如果form.tagIds有初始值,我们需要在created中初始化selectArray。 或者,我们可以只用一个watch来监听中间数组的变化,而form.tagIds的初始化在created中处理一次,之后只通过中间数组的变化来更新。而form.tagIds的更新如果不是通过中间数组(比如重置表单)则需要在重置时也重置selectArray。 考虑到简单性,推荐使用计算属性。 但是,引用[4]提到的问题:如果我们在操作过程中改变了数组(比如使用filter),可能会改变原数组,导致引用问题。在计算属性中,我们每次get返回的是一个新的数组(split的结果),所以不会影响原数据。 因此,我们采用计算属性的方式。 示例代码: 模板: <el-select v-model="selectedArray" multiple> <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value"></el-option> </el-select> 数据和方法: data() { return { form: { tagIds: '' // 字符串 }, options: [ // 下拉选项 { value: '1', label: '选项1' }, { value: '2', label: '选项2' }, { value: '3', label: '选项3' } ] } }, computed: { selectedArray: { get() { if (this.form.tagIds) { return this.form.tagIds.split(','); } else { return []; } }, set(val) { this.form.tagIds = val.join(','); } } } 注意:这里假设选项的值都是字符串,并且没有包含逗号。如果值包含逗号,那么拼接后的字符串再拆分就会出错。所以确保选项值不包含逗号。 如果选项值可能包含逗号,那么就不能用逗号分隔,可能需要换一种分隔符(比如分号)或者使用其他方式(如JSON序列化)。但通常选项值不会包含逗号。 另外,如果初始值form.tagIds是null或undefined,我们在get中处理成空数组。 但是,如果form.tagIds是空字符串,我们也返回空数组。 这样,在界面上选择时,selectedArray会变成数组,然后set中将其转换成字符串赋值给form.tagIds。当我们需要提交表单时,form.tagIds就是逗号分隔的字符串。 同时,如果我们需要重置表单,直接给form.tagIds赋值为空字符串,那么selectedArray就会变成空数组,从而清空选择。 问题:如果选项的值是数字类型怎么办? 注意:el-option的value如果是数字,那么selectedArray中会是数字,而split得到的是字符串数组,所以数字类型的值会不匹配。因此,我们需要确保选项的值是字符串类型。 解决方法: - 在选项中,将value设置为字符串形式,例如: :value="item.value.toString()" - 或者在计算属性的get中,将拆分后的字符串数组转换为数字数组(如果选项值是数字的话),但这样比较麻烦,因为不知道需要什么类型。 - 或者,我们统一使用字符串。因为最终要拼接成字符串,所以建议选项值使用字符串。 如果后端要求的是数字id组成的字符串(例如"1,2,3"),那么选项的value可以是字符串形式的数字,然后在需要传给后端时,这个字符串可以直接使用(因为后端要求字符串)或者如果需要数字数组,可以在提交前再split然后map成数字。 因此,在el-select中,我们保持选项的value为字符串,这样selectedArray就是字符串数组,拼接成字符串后就是逗号分隔的字符串。 如果从后端获取的初始值是一个数字数组组成的字符串?实际上,后端返回的字符串就是"1,2,3"这样的,所以直接使用split会得到字符串数组,而选项的value也是字符串,所以可以匹配。 示例:如果选项value是字符串,初始form.tagIds="1,2,3",那么selectedArray得到['1','2','3'],而选项的value也是字符串,所以可以正确显示。 如果选项value是数字,那么selectedArray是字符串数组,而选项value是数字,那么匹配不上(因为===严格相等,数字和字符串不相等)。所以必须保证选项value是字符串。 因此,我们可以在生成选项时,将value转换为字符串。 总结:使用计算属性实现,并确保选项的value为字符串。 另外,引用[1]中提到,如果存在多个el-select,并且涉及新增、删除、换行等,不能直接根据index存储。使用计算属性可以避免这个问题,因为每个实例都有自己的计算属性。 但是,如果在一个列表中使用,每个el-select绑定到当前行的数据,那么我们可以将计算属性定义在每一行的对象上(使用Vue组件或作用域插槽)。或者,我们可以将计算属性写在当前行的数据对象中,但这样不是响应式的,所以建议使用方法: 在列表行中,我们可以为每一行数据创建一个计算属性(在循环中,使用组件封装每一行,每个组件有自己的计算属性)或者使用方法转换。 不过,如果列表行是动态的,我们可以这样: 假设我们有一个list数组,每个元素是一个对象,包含tagIds字符串。 然后,我们可以在循环中为每个元素添加一个计算属性?这不太容易。所以我们可以使用watch或者自定义组件。 另一种方法:使用一个方法将字符串转换为数组,然后使用事件来更新字符串。 例如: <el-select :value="getArray(row.tagIds)" @change="val => handleChange(val, row)" multiple> </el-select> methods: { getArray(str) { if (str) return str.split(','); return []; }, handleChange(val, row) { row.tagIds = val.join(','); } } 这样,每次选择变化时,我们手动更新row.tagIds。但是这样会破坏双向绑定,而且每次getArray都会返回新数组,可能导致性能问题(因为每次渲染都会执行)和可能的下拉框重新渲染。 所以,在列表中使用时,推荐使用自定义组件封装每一行的el-select,在组件内部使用计算属性。 由于用户问题中没有提到列表,我们只处理单个el-select的情况。 因此,解决方案是使用计算属性。 代码示例: 根据以上分析,我们给出一个完整的例子。</think>### 解决 el-select 多选模式下绑定字符串类型的问题 在 Element UI 的 `el-select` 组件中,**多选模式默认绑定数组类型**,但可以通过以下方案实现字符串类型绑定(如 `"value1,value2"`): --- #### 解决方案:使用计算属性转换 ```vue <template> <el-select v-model="selectedArray" <!-- 绑定中间数组变量 --> multiple @change="handleChange" > <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value" /> </el-select> </template> <script> export default { data() { return { // 最终需要提交的字符串(符合后端格式) form: { selectedString: "" }, // 中间数组变量(用于 el-select 绑定) selectedArray: [], // 下拉选项 options: [ { value: "apple", label: "苹果" }, { value: "banana", label: "香蕉" } ] }; }, computed: { // 初始化时:字符串 → 数组 initSelectedArray() { return this.form.selectedString ? this.form.selectedString.split(",") : []; } }, methods: { // 选择变化时:数组 → 字符串 handleChange(arr) { this.form.selectedString = arr.join(","); } }, mounted() { // 初始化中间变量(如从后端获取字符串数据) this.selectedArray = this.initSelectedArray; } }; </script> ``` --- #### 关键点说明 1. **双向转换原理** - 初始加载:将字符串 `selectedString` 通过 `split(",")` 转为数组 → 绑定到 `selectedArray` - 用户操作:`@change` 事件将数组 `join(",")` 转为字符串 → 更新 `selectedString` - ![数据转换示意图](https://example.com/select-flow.png)[^1] 2. **避免直接修改源数据** 使用中间变量 `selectedArray` 可防止因引用传递导致的数据异常(如引用[4]所述问题)[^4]。 3. **动态列表场景** 若存在动态列表(如表格多行),需为每行创建独立的中间变量: ```javascript this.list = data.map(item => ({ ...item, _tempArray: item.selectedString.split(",") // 每行独立中间变量 })); ``` --- #### 常见问题解决 - **选项值含逗号怎么办?** 改用其他分隔符(如 `|`),并在转换时指定: ```javascript // 转换逻辑 this.form.selectedString = arr.join("|"); this.selectedArray = this.form.selectedString.split("|"); ``` - **为什么不用 `v-model` 直接绑定字符串?** `el-select` 多选模式的内部实现强制要求数组类型,直接绑定字符串会导致组件异常[^2]。 - **性能优化** 当选项数量极大(>1000)时,使用 `value-key` 指定唯一标识: ```vue <el-select value-key="id" ...> <el-option :value="{id:1, name:'Apple'}" ... /> </el-select> ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值