我试图理解为什么传递 @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) 我知道您可以用来.cornerRadius()对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) 我有一个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) 我在使用带有 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) 我正在尝试在 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) 我在 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) 在常规的 Xcode 项目应用程序中,当我创建新文件时,它会提供一个模板(例如 SwiftUI/Swift/Storyboard)供我选择。我选择一个模板,单击“下一步”,提示将允许我输入文件名。之后,Xcode 会自动生成具有给定文件名、头文件名和结构名称(如果是 SwiftUI 文件)的文件。
然而,在 Swift 包管理器项目中,创建新文件并没有让我有机会输入文件名,而是创建一个带有占位符名称(如 file.swift)的默认 Swift 或 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) 进行测试。
\nstruct ColorItem: Identifiable, Hashable{\n let color: Color\n let title: String\n \n var id: String{\n title\n }\n}\nRun Code Online (Sandbox Code Playgroud)\nstruct 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) 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) swiftui ×7
swift ×4
core-data ×2
xcode ×2
colors ×1
cornerradius ×1
ios ×1
loops ×1
nested ×1
observable ×1
rounding ×1
scrollview ×1
tabbar ×1