小编sim*_*bac的帖子

视图不会在嵌套 ForEach 循环中重新呈现

我有以下组件可以呈现半透明字符网格:

    var body: some View {
        VStack{
            Text("\(self.settings.numRows) x \(self.settings.numColumns)")
            ForEach(0..<self.settings.numRows){ i in
                Spacer()
                    HStack{
                        ForEach(0..<self.settings.numColumns){ j in
                            Spacer()
                            // why do I get an error when I try to multiply i * j
                            self.getSymbol(index:j)
                            Spacer()
                        }
                    }
                Spacer()
            }
        }
    }

Run Code Online (Sandbox Code Playgroud)

settings 是一个环境对象

每当settings更新时,最外层的文本VStack都会正确更新。但是,视图的其余部分不会更新(网格具有与以前相同的尺寸)。为什么是这样?

第二个问题:为什么不能访问i内部ForEach循环并将其作为参数传递给函数?

我在外ForEach循环出现错误:

无法推断通用参数“数据”

swiftui

20
推荐指数
1
解决办法
7033
查看次数

在 SwiftUI 中更改默认系统字体

我正在尝试在我的 SwiftUI 应用程序中设置自定义默认字体。我尝试了这个线程的几个建议为整个 iOS 应用程序设置默认字体?.

但是,这些似乎都不适用于 SwiftUI。例如使用这种方法:

// Constants.swift
struct Fonts {
    static var plex = "IBMPlexMono-Text"
}


// FontExtension.swift
extension UILabel {
    var substituteFontName : String {
        get { return self.font.fontName }
        set { self.font = UIFont(name: Fonts.plex, size: 17)! }
    }

}

// AppDelegate.swift in didFinishLaunchingWithOptions-function
UILabel.appearance().substituteFontName = Fonts.plex
Run Code Online (Sandbox Code Playgroud)

当我启动应用程序时,自定义字体会出现一瞬间,然后变回 Apple 的默认字体。为什么它会变回苹果的字体,如何永久完成?

是否可以在Text-View上进行扩展?

swiftui

7
推荐指数
1
解决办法
3748
查看次数

SwiftUI:从工作表导航到新视图

如何从工作表中将新视图推送到导航堆栈上。我想显示课程列表。当点击其中一门课程时,应该会打开一张表格,显示有关该课程的详细信息。从工作表中,人们应该能够在新的全屏视图中开始课程。

import SwiftUI

struct ContentView: View {
    var lessons = [Lesson(id:"1"), Lesson(id:"2"), Lesson(id:"3"), Lesson(id:"4"), Lesson(id:"5"), Lesson(id:"6"), Lesson(id:"7"), Lesson(id:"8"), Lesson(id:"9")]

    var body: some View {
        NavigationView(){
            Form{
                List(lessons){ lesson in
                    LessonButton(lesson: lesson)
                }
            }
        }
    }
}

struct LessonButton:View{
    @State var showSheet = false
    var lesson:Lesson

    var body: some View {
        Button(action:{self.showSheet = true}){
            Text(lesson.name)
        }.sheet(isPresented:$showSheet){
            NavigationLink(destination: Text("reached")){
                Text("start")
            }
        }
    }
}


struct Lesson: Identifiable{
    var id:String
    var name: String{
        "Lesson \(self.id)"
    }
}

Run Code Online (Sandbox Code Playgroud)

但是,NavigationLink 不起作用。我想,这是因为工作表不是内容视图的子视图。这可能就是它不起作用的原因。但怎样才能实现呢?

swiftui

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

禁用 NavigationLink SwiftUI 的向后滑动

如何在 SwiftUI 中禁用向后滑动手势?子视图只能使用后退按钮关闭。

swiftui

6
推荐指数
2
解决办法
3440
查看次数

如何在 SwiftUI 中限制 FetchRequest 中的结果数量

FetchedResults制作FetchRequestCoreData时如何限制检索到的大小?

struct ContentView: View {
    var fetchRequest:FetchRequest<Kana>

    init(){
        fetchRequest = FetchRequest<Kana>(entity: Kana.entity(), sortDescriptors: [], predicate: NSPredicate(format: "alphabet == %@", "hiragana"))
    }

    var body: some View {
        List{
            Text("10 Kanas")
            // Display 10 Kanas
        }
    }
}

Run Code Online (Sandbox Code Playgroud)

xcode core-data nsfetchrequest swiftui

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

SwiftUI 五彩纸屑动画

注意:我解决了这个问题。如果你对动画感兴趣,我用 SPM 创建了一个包,可以在https://github.com/simibac/ConfettiSwiftUI 上找到

所以我试图在 SwiftUI 中创建一个五彩纸屑动画。这是我到目前为止:

这一切都按预期工作,并使用以下代码完成:

struct Movement{
    var x: CGFloat
    var y: CGFloat
    var z: CGFloat
    var opacity: Double
}

struct FancyButtonViewModel: View {
    @State var animate = [false]
    @State var finishedAnimationCouter = 0
    @State var counter = 0
    
    var body: some View {
        VStack{
            ZStack{
                ForEach(finishedAnimationCouter...counter, id:\.self){ i in
                    ConfettiContainer(animate:$animate[i], finishedAnimationCouter:$finishedAnimationCouter, num:1)
                }
            }
            
            Button("Confetti"){
                animate[counter].toggle()
                animate.append(false)
                counter+=1
            }
        }
    }
}

struct ConfettiContainer: View {
    @Binding var animate:Bool
    @Binding var finishedAnimationCouter:Int

    var num:Int
    
    var …
Run Code Online (Sandbox Code Playgroud)

animation swiftui swiftui-animation

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

模拟器与物理设备:使用一次后 NavigationLink 损坏

我正在使用 SwiftUI 创建一个 iOS 应用程序。我正在使用:

  • Xcode 11.3 测试版 (11C24b)
  • 运行 iOS 13.3 的 iPad 模拟器
  • 物理 iPad 也运行 iOS 13.3

但是,该应用程序在两个设备上的行为不同。例如在物理 iPad 上,NavigationLink只能使用一次。

这是它在物理设备上的外观(首次使用后 NavigationLink 已损坏) 在模拟器上它完美地工作

这是我的第一个 iOS 应用程序。所以我想知道如何规避或解决这些类型的错误?

import SwiftUI

enum ExerciseType: String, CaseIterable, Codable, Hashable {
    case vowels = "Vowels"
    case special = "Special Characters"
    case small = "Small Characters"
    case long = "Long Vovels"
}

enum LessonType: String, CaseIterable, Codable, Hashable {
    case hiragana = "Introduction to Hiragana"
    case katakana = "Introduction to Katakana"
    case kanji = "Introduction …
Run Code Online (Sandbox Code Playgroud)

ios swift swiftui

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

GeometryReader 不需要的全高/全宽行为

我正在使用GeometryReader确保图像永远不会超过屏幕宽度的一半。但是,当GeometryReader请求视图的完整高度/宽度时,它会弄乱我的其余视图(如带有绿色 BG 的图像所示)。好像它插入了不需要的Spacer().

struct ContentView: View {
    var body: some View {
        VStack{
            VStack {
                GeometryReader{ g in
                    HStack{
                        Text("Text Left").background(Color.yellow)
                        Image(systemName: "checkmark")
                            .resizable()
                            .aspectRatio(contentMode:.fit)
                            .frame(maxWidth: g.size.width/2)
                    }.background(Color.yellow)
                }.background(Color.green)
            }
            Text("Bottom Text")

            // This Spacer should push the "Bottom Text" right below the other Text and Image
            Spacer()
        }
    }
}

Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

如果我删除GeometryReader并将宽度设置为固定大小,它会按预期工作并且不会显示绿色 BG。

struct ContentView: View {
    var body: some View {
        VStack{
            VStack {
                HStack{
                    Text("Text Left").background(Color.yellow)
                    Image(systemName: "checkmark")
                        .resizable()
                        .aspectRatio(contentMode:.fit) …
Run Code Online (Sandbox Code Playgroud)

swiftui

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

在 SwiftUI 中延迟转换

如何延迟过渡?我想单击一个按钮,然后视图应该延迟转换。

我有以下代码,但没有正确同步。

struct ContentView: View {
    @State var showOne = true


    var body:some View{
        VStack{
            if showOne{
                HStack{
                    Spacer()
                    Text("One")
                    Spacer()
                }
                .animation(Animation.default.delay(2))
                .background(Color.red)
                .transition(.slide)
            }else{
                HStack{
                    Spacer()
                    Text("Two")
                    Spacer()
                }
                .background(Color.blue)
                .animation(Animation.default.delay(1))
                .transition(.slide)
            }
            Button("Toggle"){
                withAnimation(){
                    self.showOne.toggle()
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

animation swift swiftui

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

每当在 SwiftUI 中更新 CoreData 时更新状态变量

从 CoreData 更新一些数据后,我还想将State- 变量更新为返回结果的数量。

当 CoreData 更改时,Stepper应始终将 设为返回结果的数量。但是,onAppear当我使用Stepper. 如何检查onAppearCoreData 是否已更改或Stepper已使用?这可能吗?

import SwiftUI

struct ContentView: View {
@State var numberOfResults = 0

@FetchRequest(entity: YourModel.entity(), sortDescriptors: [], predicate:NSPredicate(format: "isSelected == %@", NSNumber(booleanLiteral: true))) var objects: FetchedResults<YourModel>

var body: some View{
    return VStack{

        Stepper("text", value: $numberOfResults, in: 0...objects.wrappedValue.count, step:5)
            .onReceive(objects.publisher, perform: {_ in
                self.numberOfResults = self.objects.count
                print("onReceive")
            })
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

core-data swiftui

3
推荐指数
1
解决办法
1527
查看次数

SwiftUI 使用链接列表动态弹出 NavigationLink

我想从代码中弹出一个 NavigationLink。我关注了这篇文章,它适用于一个链接(https://swiftui-lab.com/bug-navigationlink-isactive/)。但是,在使用链接列表时,必须为每个 NavigationLink 使用单独的布尔值。

所以我认为这样做的聪明方法是使用一个 EnvironmentObject ,它为每个 ChildView 保存一个带有布尔值的字典:

class Navigation: ObservableObject{
    @Published var show:[UUID:Bool] = [:]
}
Run Code Online (Sandbox Code Playgroud)

假设我们想要一个可变数量的子视图(MyObject 类型)。

需要更改什么才能使其正常工作?

struct MyObject:Identifiable{
    var id = UUID()
    var name:String
}

struct ContentView: View {
    @EnvironmentObject var navigation:Navigation

    var objects = [MyObject(name: "view1"), MyObject(name: "view2"), MyObject(name: "view3")]

    init() {
        for object in objects{
            self.navigation.show[object.id] = false
        }
    }

    var body: some View {
        NavigationView{
            VStack{
                ForEach(objects, id:\.self.id){ object in
                    NavigationLink(destination: Child(object:object), isActive: self.$navigation.show[object.id], label: {
                        Text(object.name)
                    })
                }
            } …
Run Code Online (Sandbox Code Playgroud)

swiftui

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

将元素推向 Antd 两侧(一个左对齐,一个右对齐)

我将Antd 与 React 一起使用。我想在两个元素之间添加一个空格,使一个元素在最大可用空间的左侧对齐,另一个元素在最大可用空间的右侧对齐。请参阅带有文本和开关的附图。

在此输入图像描述

reactjs antd

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