Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >选择器中的SwiftUI FetchRequest命令输出

选择器中的SwiftUI FetchRequest命令输出
EN

Stack Overflow用户
提问于 2022-01-19 15:44:32
回答 1查看 133关注 0票数 0

我从一个包含国家列表( ID、国家名称和国家缩写)的远程服务器获取一个json。我正在通过ForEach填充带有这些值的选择器。

我无法解决的两个问题是:

  1. I想显示美国是挑选者的第一选择,然后是所有其他国家的字母列表。

我考虑过使用NSPredicate或NSCompoundPredicate,但这只是过滤掉值。我考虑过创建多个获取请求,过滤除美国以外的所有东西,然后其他的显示除美国以外的所有东西。这似乎是一种浪费,我不完全确定如何将它们结合起来。

  1. 基于用户的选择,我需要填充三个变量(id、name和abbr)。

我可以绑定到这个名字,它工作得很好。同样,我可以将选择器绑定到abbr,并且它可以工作。但是,我不知道如何更新所有3个变量,因为选择器只有一个绑定。我试着编写一个函数,将所有这些变量onTap都设置在ForEach中,但这似乎不是一个好计划(或者可能是?)。

下面是一些代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@FetchRequest(sortDescriptors: [SortDescriptor(\.name)] var countries: FetchedResults<Picker_Country>

// Load and decode the JSON from remote URL without caching

    func loadCountryData() async {
        
        let config = URLSessionConfiguration.default
        config.requestCachePolicy = .reloadIgnoringLocalCacheData
        config.urlCache = nil
        let URLSessionNoCache = URLSession(configuration: config)

        guard let url = URL(string: "https://api.foo.com/general/pickers/country_select") else {
            print("Invalid URL")
            return
        }

        do {
            let (data, _) = try await URLSessionNoCache.data(from: url)
            let decoder = JSONDecoder()
            decoder.dateDecodingStrategy = .iso8601
            let countries = try decoder.decode([CountryOptions].self, from: data)
            
            await MainActor.run {
                setCountryArray(with: countries)
            }

        } catch {
            print("Invalid Data")
        }
    }
    
    func setCountryArray(with downloadedCountryOptions: [CountryOptions]) {
        for countries in downloadedCountryOptions {
            let countryPicker = Picker_Country(context: moc)
            
            countryPicker.id =  Int16(countries.id)
            countryPicker.name = countries.name
            countryPicker.abbr = countries.abbr
        }
        try? moc.save()
    }

最后,这是我的选择。

(注意: wrappedName和wrappedAbbr只是允许我不必合并的vars。它们直接对应于名称和缩写)

显然,通过使用.tag,我显示了名称,但只设置了abbr,这也是所选内容的绑定对象。这就是如何在用户选择中设置id、name和abbr的问题。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Picker("Country", selection: $createUser.countryAbbr) {
    ForEach(countries) { country in
        Text(country.wrappedName).tag(country.wrappedAbbr)
    } // End ForEach
} // End Picker
.pickerStyle(WheelPickerStyle())
.padding()
.labelsHidden()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-20 07:30:58

其实比我想象的要简单得多。在不使用ForEach的情况下创建选择器时,可以执行以下操作:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Picker("Fooblah", selection: $fooblah) {
    Text("foo").tag(0)
    Text("blah").tag(1)
} // End Picker

现在,由于JSON存储在CoreData中,而且我们可以使用NSPredicate过滤FetchRequest的结果,因此您可以执行两个FetchRequests,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@FetchRequest(sortDescriptors: [], predicate: NSPredicate(format: "abbr == 'US'")) var countryUS: FetchedResults<Picker_Country>
    @FetchRequest(sortDescriptors: [SortDescriptor(\.name)], predicate: NSPredicate(format: "abbr != 'US'")) var countries: FetchedResults<Picker_Country>

第一个FetchRequest只返回美国,第二个返回除美国以外的所有内容。

现在,当创建选择器时,执行两个ForEach语句,就像执行两个或多个文本语句一样,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Picker("Country", selection: $createUser.countryAbbr) {
    ForEach(countryUS) { country in
        Text(country.wrappedName).tag(country.wrappedAbbr)
    } // End US ForEach
    ForEach(countries) { country in
        Text(country.wrappedName).tag(country.wrappedAbbr)
    } // End All except US ForEach
} // End Picker

使用CoreData并绑定到国家的缩写,然后可以创建关系,以便在managedObjectContext中调用相应的国家名称,就像调用国家缩写一样。

另一个提示是,如果您希望只使用国家缩写,但仍然以某种方式显示整个国家的名称,您可以通过内置区域设置功能这样做,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Text(Locale.current.localizedString(forRegionCode: createUser.countryAbbr) ?? createUser.countryAbbr)

现在,这对于您希望在CoreData的选择器中显示的任何类型的结果都是灵活的。只需修改适合您的情况的NSPredicate过滤器即可。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70779174

复制
相关文章
优化在 SwiftUI List 中显示大数据集的响应效率
拥有优秀的交互效果和手感,是很多 iOS 开发者长久以来坚守的原则。同样一段代码,在不同数据量级下的响应表现可能会有云泥之别。本文将通过一个优化列表视图的案例,展现在 SwiftUI 中查找问题、解决问题的思路,其中也会对 SwiftUI 视图的显式标识、@FetchRequest 的动态设置、List 的运作机制等内容有所涉及。本文的范例需运行在 iOS 15 及以上系统,技术特性也以 SwiftUI 3.0 为基础。
东坡肘子
2022/07/28
9.3K0
优化在 SwiftUI List 中显示大数据集的响应效率
SwiftUI属性包装器如何处理结构体
已经了解了 SwiftUI 如何通过使用 @State 属性包装器将变化的数据存储在结构体中,如何使用 $ 将状态绑定到UI控件的值,以及更改 @state 包装的属性时是如何自动让 SwiftUI 重新调用我们的结构体的 body属性的。
网罗开发
2021/11/30
1.7K0
SwiftUI属性包装器如何处理结构体
SwiftUI 中的Stack
就从Stack说起,stack查看文档我们看到HVZ三种stack,那么分别是怎么用的呢?
大话swift
2019/07/03
2.3K0
SwiftUI 中的Stack
SwiftUI 与 Core Data —— 数据获取
本文中我们将探讨在 SwiftUI 视图中批量获取 Core Data 数据的方式,并尝试创建一个可以使用 mock 数据的 FetchRequest。由于本文会涉及大量 前文[1] 中介绍的技巧和方法,因此最好一并阅读。
东坡肘子
2022/12/16
4.7K0
SwiftUI 与 Core Data —— 数据获取
ObservableObject研究
我是在去年阅读王巍写的《SwiftUI 与 Combine 编程》才第一次接触到单一数据源这一概念的。
东坡肘子
2022/07/28
2.4K0
ObservableObject研究
只在视图 Body 中生存的变量
SwiftUI 通过调用视图实例的 body 属性来获取视图值。在 View 协议中,body 被属性包装器 @ViewBuilder 所标注,这意味着,通常我们只能在 body 中使用 ViewBuilder 认可的 Expression 来声明视图( 如果显式使用 return ,虽然可以避开 ViewBuilder 的限制,但因受只能返回一种类型的限制,影响视图的表达能力 )。
东坡肘子
2023/05/18
6970
只在视图 Body 中生存的变量
SwiftUI 中布局的工作原理
在这个技术项目中,我们将探讨 SwiftUI 如何处理布局。有些事情已经解释过了,有些可能是你自己弄明白的,但更多的是你在这一点上想当然的事情,所以我希望一个详细的探索能真正为 SwiftUI 的工作方式提供一些启示。
Swift社区
2021/11/26
3.8K0
SwiftUI 中布局的工作原理
linux中history命令的格式化输出
在/etc/prifile.d目录下新建一个文件,用户登录系统时自动生效 vim /etc/profile.d/history_conf.sh source /etc/profile.d/history_conf.sh # 手动生效 文件内容 export HISTFILE="$HOME/.bash_history" # 指定命令写入文件(默认~/.bash_history) export HISTSIZE=1000 # history输出记录数 export HISTFILESIZE=10000
Amadeus
2022/11/16
2.3K0
linux中history命令的格式化输出
如何结合 Core Data 和 SwiftUI
SwiftUI 和 Core Data 之间相差将近十年 —— SwiftUI 随着 iOS 13 面世而 Core Data 则是 iPhoneOS 3 的产物;很久以前,它还没有被称为 iOS,因为 iPad 尚未发布。尽管时间相距遥远,Apple 还是投入了大量工作以确保这两种强大的技术能够完美地相互配合使用,这意味着 Core Data 就像始终以这种方式设计一样,已集成到 SwiftUI 中。
Swift社区
2021/11/26
11.8K0
如何结合 Core Data 和 SwiftUI
如何在Xcode下预览含有Core Data元素的SwiftUI视图
从SwiftUI诞生之日起,预览(Canvas Preview )一直是个让开发者又爱又恨的功能。当预览正常工作时,它可以极大地提高开发效率;而预览又随时可能因为各种莫名其妙的原因崩溃,不仅影响开发进程,同时又让开发者感到沮丧(很难排查出导致预览崩溃的故障)。
东坡肘子
2022/07/28
5.2K0
如何在Xcode下预览含有Core Data元素的SwiftUI视图
SwiftUI中的水平条形图
水平条形图以矩形条的形式呈现数据类别,其宽度与它们所代表的数值成正比。本文展示了如何在垂直条形图的基础上创建一个水平柱状图。
韦弦zhy
2022/11/07
4.8K0
SwiftUI中的水平条形图
掌握 Transaction,实现 SwiftUI 动画的精准控制
SwiftUI 因其简便的动画 API 与极低的动画设计门槛而广受欢迎。但是,随着应用程序复杂性的增加,开发者逐渐发现,尽管动画设计十分简单,但要实现精确细致的动画控制并非易事。同时,在 SwiftUI 的动画系统中,有关 Transaction 的解释很少,无论是官方资料还是第三方文章,都没有对其运作机制进行系统的阐述。
东坡肘子
2023/07/08
5340
掌握 Transaction,实现 SwiftUI 动画的精准控制
如何在SwiftUI中实现interactiveDismissDisabled
由于健康笔记[2]中数据录入都是在Sheet中进行的,为了防止用户在录入过程中由于误操作(使用手势取消Sheet)丢失数据,因此,从最初的版本开始,我就一直使用各种手段加强对Sheet的控制。
东坡肘子
2022/07/28
3.9K0
如何在SwiftUI中实现interactiveDismissDisabled
Ask Apple 2022 中与 Core Data 有关的问答 (下)
Ask Apple 为开发者与苹果工程师创造了在 WWDC 之外进行直接交流的机会。本文对本次活动中与 Core Data 有关的一些问答进行了整理,并添加了一点个人见解。本文为下篇。
东坡肘子
2022/12/16
3.3K0
玩转tee命令 派发命令行的输出
我知道如何使用tee将 aaa.sh 的输出(标准输出)写入 bbb.out,同时还在终端中显示:
程序熵
2023/09/25
1930
玩转tee命令 派发命令行的输出
top命令输出详解
Linux下的top命令我相信大家都用过,自从我接触Linux以来就一直用top查看进程的CPU和MEM排行榜。但是top命令的其他输出结果我都没有了解,这些指标都代表什么呢,什么情况下需要关注呢?以及top命令输出结果的来源数据是什么呢,又是怎么一个计算原理呢?
用户2937493
2019/08/29
2.2K0
了解 SwiftUI 的 onChange
从 iOS 14 开始,SwiftUI 为视图提供了 onChange 修饰器,通过使用 onChange,我们可以在视图中对特定的值进行观察,并在其更改时触发操作。本文将对 onChange 的特点、用法、注意事项以及替代方案做以介绍。
东坡肘子
2022/07/28
2.9K0
深入了解 SwiftUI 5 中 ScrollView 的新功能
为可滚动容器的内容或滚动指示器(Scroll Indicator)添加外边距(Margin)。
东坡肘子
2023/07/08
9270
深入了解 SwiftUI 5 中 ScrollView 的新功能
在 SwiftUI 中实现视图居中的若干种方法
将某个视图在父视图中居中显示是一个常见的需求,即使对于 SwiftUI 的初学者来说这也并非难事。在 SwiftUI 中,有很多手段可以达成此目的。本文将介绍其中的一些方法,并对每种方法背后的实现原理、适用场景以及注意事项做以说明。
东坡肘子
2022/12/16
6.8K0
在 SwiftUI 中实现视图居中的若干种方法
JAVA中调用CMD命令,并输出运行结果
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/119104.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/09
1.9K0

相似问题

@ SwiftUI中的FetchRequest

12

@FetchRequest中的SwiftUI和动态NSSortDescriptors

117

核心数据@FetchRequest SwiftUI

11

SwiftUI -在FetchRequest中包含关系信息

11

如何刷新SwiftUI coreData @FetchRequest结果?

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文