小编Ric*_*oon的帖子

将 ObservedObject 传递给嵌套的子视图 SwiftUI(SwiftUI 数据流)

我试图理解为什么传递 @ObservedObject 变量对嵌套子视图不起作用。可以传递数据,但更改仅反映在创建 @ObservedObject 变量的根视图中。更改不会显示在子视图中。查看 Apple 文档(已针对 Xcode beta 5 进行了更新),答案似乎是创建一个环境对象和一个常规变量,以便从环境对象中获取正确的索引。这是苹果的例子

我的理解是,@ObservedObject 可用于从多个视图引用变量,但如果您希望从任何视图都可以访问数据,那么您应该使用环境对象。因此我相信通过@ObservedObject 应该是可能的。我认为正在发生的问题是,由于 ScreenTwo 将 @Binding 变量传递给 DetailsView,这就是导致问题的原因。为了解决这个问题,我认为您需要继续传递完整的@ObservedObject,但是您再次需要某种类型的常规变量来获得正确的索引。

我觉得所有这些都应该更直接。

import SwiftUI
import Combine

struct Sport: Identifiable{
    var id = UUID()
    var name : String
    var isFavorite = false
    var school : String
}

final class SportData: ObservableObject  {
    @Published var store =
        [
            Sport(name: "soccer", isFavorite: false, school: "WPI"),
            Sport(name: "tennis", isFavorite: false, school: "WPI"),
            Sport(name: "swimming", isFavorite: true, school: "WPI"),
            Sport(name: "running", isFavorite: true, school: "RIT"), …
Run Code Online (Sandbox Code Playgroud)

xcode nested observable swiftui

22
推荐指数
1
解决办法
1万
查看次数

圆角特定SwiftUI

我知道您可以用来.cornerRadius()对swiftUI视图的所有角进行圆角处理,但是有没有办法只对特定的角部(例如顶部)进行圆角处理?

user-interface rounding cornerradius swiftui

13
推荐指数
8
解决办法
1772
查看次数

SwiftUI 多个标签垂直对齐

有很多解决方案可以尝试使用 VStack 内的 HStack 在 SwiftUI 中对齐多个图像和文本。有什么办法可以实现多个标签吗?添加到列表中时,多个标签会自动垂直对齐。当它们嵌入到 VStack 中时,是否有一种简单的方法可以做到这一点?

在此输入图像描述

struct ContentView: View {
    var body: some View {
//        List{
        VStack(alignment: .leading){
            Label("People", systemImage: "person.3")
            Label("Star", systemImage: "star")
            Label("This is a plane", systemImage: "airplane")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

swiftui

11
推荐指数
1
解决办法
2811
查看次数

在 UICollectionViewLayout 网格中使用估计高度时,使 NSCollectionLayoutItem 高度与 NSCollectionLayoutGroup 一样高

我有一个UICollectionViewLayout包含三列的网格。列中的每个项目都有一个充满文本的单元格。我希望所有列的高度与组中最高的项目相同。使用UICollectionViewCompositionalLayout我很难获得想要的结果。

关于如何实现这一目标有什么想法吗?全部代码如下。功能createLayout是最相关的。请注意,我正在使用LoremSwiftum生成随机文本。

目前的行为 在此输入图像描述

预期行为:

我能够通过将 更改NSCollectionLayoutSize为绝对值 500 来模拟这种预期行为。这不是想要的。每个单元格应该估计其大小,并使用该组的最大值。

let itemSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1.0),
                                      heightDimension: .absolute(500))
let item = NSCollectionLayoutItem(layoutSize: itemSize)
        
let groupSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1.0),
                                       heightDimension: .absolute(500))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

整个代码:

import UIKit
import LoremSwiftum


class ViewController: UIViewController {
    enum Section {
        case main
    }
    
    var dataSource: UICollectionViewDiffableDataSource<Section, Int>! = nil
    var collectionView: UICollectionView! = nil
    let sectionBackgroundDecorationElementKind = "section-background-element-kind"
    
    override func viewDidLoad() {
        super.viewDidLoad()
        navigationItem.title = "Two-Column Grid"
        configureHierarchy()
        configureDataSource() …
Run Code Online (Sandbox Code Playgroud)

uicollectionview uicollectionviewcompositionallayout

11
推荐指数
2
解决办法
1804
查看次数

带有 ScrollView 和导航栏 SwiftUI 的屏幕背景颜色

我在使用带有 SwiftUI 的滚动视图时尝试使用彩色背景,但这会导致导航标题不再折叠。我已经尝试了多种方法,但这始终是一个问题。

struct Person : Identifiable{
    var id : Int
    var name : String
}

struct ContentView: View {
    let people = [
        Person(id: 1, name: "Ricky"),
        Person(id: 2, name: "Dani"),
        Person(id: 3, name: "Mark"),
        Person(id: 4, name: "Kailin"),
        Person(id: 5, name: "James"),
        Person(id: 5, name: "Jenna")
    ]

    var body: some View {
        NavigationView{
            ZStack{
                Color.red
                    .edgesIgnoringSafeArea(.all)
                ScrollView{
                    ForEach(people, id: \.id) { person in
                        Text(person.name)
                            .frame(width: 300, height: 400)
                            .background(Color.blue)
                            .padding()
                    }
                }.navigationBarTitle("Home")
            }
        }
    }

    //    init(){
    // …
Run Code Online (Sandbox Code Playgroud)

colors ios swift swiftui

10
推荐指数
1
解决办法
3172
查看次数

在 swiftUI 视图模型中使用 FetchRequest

我正在尝试在 swiftUI 中遵循 MVVM 模式,但遇到了核心数据和获取请求的问题。我看过的所有视频和我读过的文章,在视图中都有一个@FetchRequest,用于访问和修改核心数据。我如何将它放在 SettingsVCModel 中?我似乎无法弄清楚,因此我将获取请求保留在视图结构(SettingsVC)中并在那里使用它。然而,到目前为止,这是使用按钮,您可以在其中执行操作。现在我需要用一个切换来完成它,它只有一个与之关联的绑定变量,没有像按钮那样的动作。我在 SettingsVCModel 内的 @Published bio 上尝试了 didSet 方法,但他们无权访问获取请求。任何帮助将不胜感激。我正在使用的代码如下。

struct SettingsVC: View {
    @Environment(\.managedObjectContext) var managedObjectContext
    @FetchRequest(fetchRequest: UserSettings.getUserSettings()) var userSettings : FetchedResults<UserSettings>
    @ObservedObject var model = SettingsVCModel()

    var body: some View {
        NavigationView {
            Form{
                Section(header: Text("Application")){
                    Toggle(isOn: $model.bio, label: {Text(model.determineBiometricType())})
                    Picker(selection: $model.unitSelection, label: Text("Units")) {
                        Text("Imperial").tag(0)
                        Text("Metric").tag(1)
                    }
                    SettingsButton(toggleButton: $model.openSettings, title: "System Authorizations")
                }
                Section(header: Text("Feedback")){
                    NavigationLink(destination: ContactVC()){
                        Text("Contact Me")
                    }
                    SettingsButton(toggleButton: $model.rateApp, title: "Please Rate Body Insights")
                    SettingsButton(toggleButton: $model.tellAFriend, title: "Tell a Friend") …
Run Code Online (Sandbox Code Playgroud)

core-data nsfetchrequest swift

9
推荐指数
1
解决办法
2415
查看次数

SwiftUI FetchRequest 和 onReceive 导致无限循环

我在 swiftUI 中有一个用于 NSManagedObject 的 @FetchRequest。当使用切换时,我试图通过调用 onReceive 来更改核心数据中第一项的标题。这,如果获取的成果在MainVC使用工作。为了证明这一点,导航按钮标题是获取的结果中有多少元素。这最终会在 ContentView onRecieve 方法中创建一个无限循环。如果导航按钮具有常规文本而不是使用 FetchedResults 中的任何内容,则没有循环,一切都按预期工作。这个循环是如何引起的,是否有更好的方法来切换特定的核心数据元素?

import SwiftUI
import CoreData

final class ContentVCModel : ObservableObject{
    @Published var newToDoItem = String()
    @Published var shouldTurnOn = false

    func createNewToDoItem(){
        let moc = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext

        let toDoItem = ToDoItem(context: moc)
        toDoItem.title = self.newToDoItem
        toDoItem.createdAt = Date()
        toDoItem.cost = Cost(main: "$\(Int.random(in: 1...99))", tax: "$\(Int.random(in: 1...9))")
        toDoItem.isOn = false

        ToDoItem.save()
        self.newToDoItem = ""
    }
}

struct ContentView: View {
    @ObservedObject var model = ContentVCModel()
    @Environment(\.managedObjectContext) …
Run Code Online (Sandbox Code Playgroud)

loops core-data nsfetchrequest swiftui

8
推荐指数
0
解决办法
756
查看次数

为什么 Swift 包管理器不询问文件名?

在常规的 Xcode 项目应用程序中,当我创建新文件时,它会提供一个模板(例如 SwiftUI/Swift/Storyboard)供我选择。我选择一个模板,单击“下一步”,提示将允许我输入文件名。之后,Xcode 会自动生成具有给定文件名、头文件名和结构名称(如果是 SwiftUI 文件)的文件。

然而,在 Swift 包管理器项目中,创建新文件并没有让我有机会输入文件名,而是创建一个带有占位符名称(如 file.swift)的默认 Swift 或 SwiftUI 文件。

这是已知问题或错误吗?为什么会有这种行为?有办法改变这个吗?

质疑信用

xcode swift swift-package-manager swift-package

8
推荐指数
1
解决办法
540
查看次数

SwiftUI 选项卡选择不适用于任何可哈希内容

SwiftUI\xe2\x80\x99s 选项卡选择应该适用于任何可哈希的内容,但这似乎不起作用。

\n

在提供的示例中,您可以看到在 \xe2\x80\x9cWorking\xe2\x80\x9d Tab 中,如果您使用整数作为选项卡选择,则所有内容都可以正常工作。当您切换到 \xe2\x80\x9cBroken\xe2\x80\x9d 选项卡时,选择的是 ColorItem,并且选择不会更新视图。

\n

我相信这是一个 SwiftUI 错误并已提交反馈(FB8879981)。

\n

使用 Xcode 12.2 和 iOS 14.2(RC) 进行测试。

\n
struct ColorItem: Identifiable, Hashable{\n    let color: Color\n    let title: String\n    \n    var id: String{\n        title\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n
struct ContentView: View {\n    let items = [\n        ColorItem(color: .red, title: "Red"),\n        ColorItem(color: .blue, title: "Blue"),\n        ColorItem(color: .purple, title: "Purple")\n    ]\n    \n    var body: some View {\n        TabView{\n            TabViewWorking(items: items)\n                .tabItem {\n                    Label("Working", systemImage: "hand.thumbsup")\n                }\n            \n            TabViewBroken(items: items)\n                .tabItem …
Run Code Online (Sandbox Code Playgroud)

tabbar swiftui

6
推荐指数
1
解决办法
4530
查看次数

SwiftUI 自动调整底部工作表的大小

SwiftUI 有很多底部工作表的示例,但是它们都指定了使用 GeometryReader 工作表可以增长到的某种类型的最大高度。我想要的是创建一个底部工作表,其高度仅与其中的内容一样高。我使用首选项键提出了下面的解决方案,但必须有更好的解决方案。也许使用某种类型的动态滚动视图是解决方案?

struct ContentView: View{
    @State private var offset: CGFloat = 0
    @State private var size: CGSize = .zero

    var body: some View{
        ZStack(alignment:.bottom){
            VStack{
                Button(offset == 0 ? "Hide" : "Show"){
                    withAnimation(.linear(duration: 0.2)){
                        if offset == 0{
                            offset = size.height
                        } else {
                            offset = 0
                        }
                    }
                }
                .animation(nil)
                .padding()
                .font(.largeTitle)
                Spacer()
            }
            BottomView(offset: $offset, size: $size)
        }.edgesIgnoringSafeArea(.all)
    }
}

struct BottomView: View{
    @Binding var offset: CGFloat
    @Binding var size: CGSize

    var body: some View{
        VStack(spacing: …
Run Code Online (Sandbox Code Playgroud)

scrollview swift swiftui geometryreader

5
推荐指数
1
解决办法
9287
查看次数