小编Arn*_*ani的帖子

使用 AppStorage 在 SwiftUI 中持久存储字符串数组

我正在尝试使用 AppStorage 属性包装器在用户默认值中存储字符串数组,如下所示:

@AppStorage("History") var history: [String] = ["End of history"]
Run Code Online (Sandbox Code Playgroud)

但是我得到了错误No exact matches in call to initializer

如果我没记错的话,这是 AppStorage 的限制吗?因为 UserDefaults 可以存储数组?我可以使用什么解决方法?

arrays swift userdefaults swiftui appstorage

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

添加自定义字体作为字体类型 SwiftUI 的扩展

首先要明确的是,我不是在问如何向 SwiftUI 添加自定义字体,而是在问如何使用自定义字体扩展 Font 类型。

例如,我使用自定义字体Manrope。我将 ttf 文件添加到我的项目中,并将其添加到我的信息 plist 中。目前我必须使用这样的字体:

.font(.custom("Manrope-SemiBold", size: 24))
Run Code Online (Sandbox Code Playgroud)

我想知道是否可以扩展 Font,以便我可以像这样使用 Manrope

.font(.manrope.semibold())
Run Code Online (Sandbox Code Playgroud)

或者

.font(.manrope("Semibold"))
Run Code Online (Sandbox Code Playgroud)

fonts swift swiftui

7
推荐指数
2
解决办法
4526
查看次数

在 swift 中使用 UUID() 和 json

我在网上找到了在 json 文件中使用硬编码 uuid 的示例,并且这些示例非常适合我,但是当我在应用程序中添加从 json 数组中删除项目的功能时,我需要动态创建这些 uuid

这是我的json文件(list.json),它曾经有硬编码的id,如“id”:1并且有效(当我使用int作为ids时)

[
  {
    "name": "Dune",
    "author": "Frank Herbert",
    "page": "77"
  },
  {
    "name": "Ready Player One",
    "author": "Ernest Cline",
    "page": "234"
  },
  {
    "name": "Murder on the Orient Express",
    "author": "Agatha Christie",
    "page": "133"
  }
]
Run Code Online (Sandbox Code Playgroud)

这是我的结构(Book.swift)

struct Book: Hashable, Codable, Identifiable {
    var id = UUID()
    var name: String
    var author: String
    var page: String
}
Run Code Online (Sandbox Code Playgroud)

当我使用此结构和代码(Data.swift)解码我的 json 文件时...

let bookData: [Book] = load("list.json")

func load<T: Decodable>(_ filename: String) -> T …
Run Code Online (Sandbox Code Playgroud)

json swift codable decodable

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

使用 URLSession 获取数据时“不允许从后台线程发布更改”

我正在尝试从 Unsplash API 获取数据,但收到以下错误:“不允许从后台线程发布更改;请确保在模型更新时从主线程发布值(通过 receive(on:) 等运算符)” ”。

这是模型结构:

// MARK: - UnsplashData
struct UnsplashData: Codable {
    let id: String
    let createdAt, updatedAt, promotedAt: Date
    let width, height: Int
    let color, blurHash: String
    let unsplashDataDescription: String?
    let altDescription: String
    let urls: Urls
    let links: UnsplashDataLinks
    let categories: [String]
    let likes: Int
    let likedByUser: Bool
    let currentUserCollections: [String]
    let sponsorship: JSONNull?
    let user: User
    let exif: Exif
    let location: Location
    let views, downloads: Int

    enum CodingKeys: String, CodingKey {
        case id
        case …
Run Code Online (Sandbox Code Playgroud)

json swift urlsession

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

isPlaceholder 修饰符不可用,并且在小部件套件 + SwiftUI 中不起作用

我正在跟踪 Fromm wwdc 2020 上的小部件代码,在第一部分中他们提到使用新的占位符 api 和.isPlacholder. 所以我尝试在我的小部件中实现它,如下所示:

struct PlaceholderView: View {
    var body: some View {
        RandomWidgetView(book: testBook)
            .isPlaceholder(true)
    }
}
Run Code Online (Sandbox Code Playgroud)

但是我得到了错误Value of type 'RandomWidgetView' has no member 'isPlaceholder'。谷歌搜索后我发现了这个:

struct PlaceholderView: View {
    var body: some View {
        RandomWidgetView(book: testBook)
            .redacted(reason: .placeholder)
    }
}
Run Code Online (Sandbox Code Playgroud)

然而,这并没有创建正确的占位符,而是完全删除了内部的视图。

我是否缺少导入或者自 wwdc 以来它已更改?如何创建正确的占位符?

wwdc swift widgetkit swiftui

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

调用我的包时,由于“内部”保护级别,“CircularProgressView”初始值设定项无法访问

我正在制作一个 swiftUI 包,可以在这里找到

public struct CircularProgressView: View {
    
    var count: Int
    var total: Int
    var progress: CGFloat
    
    var fontOne: Font = Font.system(size: 75, weight: .bold, design: .rounded)
    var fontTwo: Font = Font.system(size: 25, weight: .bold, design: .rounded)

    var colorOne: Color = Color.primary
    var colorTwo: Color = Color.gray

    var fill = LinearGradient(gradient: Gradient(colors: [Color.green, Color.blue]), startPoint: .top, endPoint: .bottom)
    var lineWidth: CGFloat = 25.0
    
    public var body: some View {
        ZStack{
            Circle()
                .stroke(lineWidth: lineWidth)
                .opacity(0.3)
                .foregroundColor(Color.secondary)
            
            Circle()
                .trim(from: 0.0, to: …
Run Code Online (Sandbox Code Playgroud)

package swift swiftui

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

如何使我的小部件更频繁地更新或在应用程序内发生操作时更新

我有一个从我的应用程序获取数据的小部件。该小部件工作正常,但更新不够频繁。理想情况下,我希望它能够在我的应用程序中删除或添加项目时进行更新,因此如果有一种方法可以强制小部件更新,那么这是可行的。否则,如果小部件可以更频繁地获取新数据,那么也可以正常工作。

数据存储在应用程序组中的 json 文件中。我将该数据加载并解码到一个数组中,然后从该数组中选择一个随机项目进行显示。

这是小部件提供程序:

let testBook = Book(id: UUID(), name: "Name", author: "Author", genre: "Error", page: "0", total: "77")

public enum AppGroup: String {
  case Livre = "group.com.identifier"

  public var containerURL: URL {
    switch self {
    case .Livre:
      return FileManager.default.containerURL(
      forSecurityApplicationGroupIdentifier: self.rawValue)!
    }
  }
}

struct Provider: TimelineProvider {
    func placeholder(in context: Context) -> SimpleEntry {
        SimpleEntry(date: Date(), book: testBook)
    }

    func getSnapshot(in context: Context, completion: @escaping (SimpleEntry) -> ()) {
        let entry = SimpleEntry(date: Date(), book: testBook)
        completion(entry) …
Run Code Online (Sandbox Code Playgroud)

json ios swift widgetkit swiftui

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