我有以下组件可以呈现半透明字符网格:
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 应用程序中设置自定义默认字体。我尝试了这个线程的几个建议为整个 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上进行扩展?
如何从工作表中将新视图推送到导航堆栈上。我想显示课程列表。当点击其中一门课程时,应该会打开一张表格,显示有关该课程的详细信息。从工作表中,人们应该能够在新的全屏视图中开始课程。
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 不起作用。我想,这是因为工作表不是内容视图的子视图。这可能就是它不起作用的原因。但怎样才能实现呢?
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) 注意:我解决了这个问题。如果你对动画感兴趣,我用 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) 我正在使用 SwiftUI 创建一个 iOS 应用程序。我正在使用:
但是,该应用程序在两个设备上的行为不同。例如在物理 iPad 上,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) 我正在使用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) 如何延迟过渡?我想单击一个按钮,然后视图应该延迟转换。
我有以下代码,但没有正确同步。
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) 从 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) 我想从代码中弹出一个 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) 我将Antd 与 React 一起使用。我想在两个元素之间添加一个空格,使一个元素在最大可用空间的左侧对齐,另一个元素在最大可用空间的右侧对齐。请参阅带有文本和开关的附图。