我按照這里的例子:SwiftUI 3 MacOs Table single selection and double click open sheet
但這對我來說效果不佳。
我有這樣的結構:
struct Response: Codable {
var items: [Repository]
}
struct Repository: Codable, Identifiable {
var number = UUID()
var id: Int = 0
let name: String
let updated_at: String
let owner: Owner
let stargazers_count: Int
let forks_count: Int
let language: String?
let description: String?
struct Owner: Codable {
let login: String
}
enum CodingKeys: String, CodingKey {
case name, updated_at, owner, stargazers_count, forks_count, language, description
}
}
class Api : ObservableObject{
func loadData(query: String = "javascript", completion:@escaping ([Repository]) -> ()) {
guard let url = URL(string: "https://api.github.com/search/repositories?q=\(query)") else {
print("Invalid url...")
return
}
URLSession.shared.dataTask(with: url) { data, response, error in
if let decodedResponse = try? JSONDecoder().decode(Response.self, from: data!) {
var id = 0
let results = decodedResponse.items.map { (repo: Repository) -> Repository in
var copyRepo = repo
copyRepo.id = id
id = 1
return copyRepo
}
print(results)
DispatchQueue.main.async {
completion(results)
}
}
}.resume()
}
}
...
@State var repositories = [Repository]()
@State private var sortOrder = [KeyPathComparator(\Repository.name)]
@State private var selectedRepository: Repository.ID?
public var body: some View {
if(selectedRepository != nil)//null??
Text(repositories[selectedRepository!].name)
Table(repositories, selection: $selectedRepository, sortOrder: $sortOrder) {
TableColumn("Name") {
Text($0.name)
.frame(
maxWidth: .infinity,
maxHeight: .infinity,
alignment: .leading
)
.contentShape(Rectangle())
.contextMenu {
Button(action: {}) { Text("Action") }
}
/*.gesture(TapGesture(count: 2).onEnded {
print("pr", selectedRepository )
})*/
}
TableColumn("Last updated"){
Text($0.updated_at)
}
TableColumn("Owner", value: \.owner.login)
}
.onAppear() {
Api().loadData { (repositories) in
self.repositories = repositories
self.isLoading = false
}
}
.onChange(of: sortOrder) {
print($0)
repositories.sort(using: $0)
}
}
我想確保當用戶單擊表格的一個元素,然后激活選擇以在文本欄位中顯示所選元素的資料時,我試圖列印名稱但它不起作用。
啟動應用程式后,它給了我以下錯誤:Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value
你能幫我個忙嗎?
uj5u.com熱心網友回復:
可能是一些缺失的字符:
if(selectedRepository != nil)//null?? <- missing '{'
Text(repositories[selectedRepository!].name)
也可以這樣寫:
if let selectedRepository = selectedRepository {
Text(repositories[selectedRepository!].name)
...
}
即使沒有必要,我總是更喜歡初始化屬性(這更像是一種有用的習慣):
@State private var selectedRepository: Repository.ID? = nil
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/452279.html
上一篇:為什么我的警報控制器沒有在我的Swift應用程式中關閉?
下一篇:應用商店連接操作錯誤資產驗證失敗
