来自 TextField 数据 SwiftUI 的动态列表



我刚开始学习Swift编程语言,有一个问题。我正在尝试创建一个简单的单页应用程序,您可以在其中将电影添加到收藏夹列表中。电影必须有两个属性:标题(字符串,必填(和年份(整数,必填(。但我有一个问题,我不知道如何把它放在一排。还有,如何忽略重复的电影?

import SwiftUI
struct Movie: Identifiable {
let id = UUID()
var title: String
}
class Model: ObservableObject {
@Published var movies: [Movie] = []
}
struct DynamicList: View {

@StateObject var model = Model()
@State var text = ""
@State var year = ""

var body: some View {
VStack {
Section() {
TextField("Title", text: $text)
.padding()
.border(.gray)
TextField("Year", text: $year)
.padding()
.border(.gray)
.keyboardType(.numberPad)
Button(action: {
self.addToList()
}, label: {
Text("Add")
.frame(width: 80, height: 40, alignment: .center)
.background(Color.blue)
.cornerRadius(8)
.foregroundColor(.white)
})
.padding()
}
List {
ForEach(model.movies) { movie in
MovieRow(title: movie.title)
}
}
}
.padding()
}

func addToList() {
guard !text.trimmingCharacters(in: .whitespaces).isEmpty else {
return
}

guard !year.trimmingCharacters(in: .whitespaces).isEmpty else {
return
}

let newMovie = Movie(title: text)
model.movies.append(newMovie)

Spacer()
let newYear = Movie(title: year)
model.movies.append(newYear)
}

}
struct MovieRow: View {
let title: String

var body: some View {
Label (
title: { Text(title)},
icon: { Image(systemName: "film") }
)
}
}

这是解决方案它将在一行中显示数据,以及如何忽略要显示到列表中的重复电影。检查以下代码:

import SwiftUI
struct Movie: Identifiable {
var id = UUID()
let title: String
let year: String
}
class MoviesViewModel: ObservableObject {
@Published var movies: [Movie] = []
}
struct ContentView: View {

@State var boolValue = false
@StateObject var viewModel = MoviesViewModel()
@State var text = ""
@State var year = ""

var body: some View {
VStack {
Section() {
TextField("Title", text: $text)
.padding()
.border(.gray)
TextField("Year", text: $year)
.padding()
.border(.gray)
.keyboardType(.numberPad)
Button(action: {
self.addToList()
}, label: {
Text("Add")
.frame(width: 80, height: 40, alignment: .center)
.background(Color.blue)
.cornerRadius(8)
.foregroundColor(.white)
})
.padding()
}
// Show the data in list form
List {
ForEach(viewModel.movies) { movie in
MovieRow(title: movie.title, year: movie.year)
}
}
}
.padding()
}

func addToList() {
guard !text.trimmingCharacters(in: .whitespaces).isEmpty else {
return
}

guard !year.trimmingCharacters(in: .whitespaces).isEmpty else {
return
}


// Condition to check whether the data is already exit or not
boolValue = false
let newMovie = Movie(title: text, year: year)
for movie in viewModel.movies{
if ((movie.title.contains(text)) && (movie.year.contains(year))){
boolValue = true
}
}
// check if boolValue is false so the data will store into the array.
if boolValue == false{
viewModel.movies.append(newMovie)
text = ""
year = ""
}
}

}
struct MovieRow: View {
let title: String
let year: String

var body: some View {
// Show the data insert into the textfield
HStack{
Label (
title: { Text(title)},
icon: { Image(systemName: "film") }
)
Spacer()
Label (
title: { Text(year)},
icon: { Image(systemName: "calendar") }
)
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}

也许有人需要类似的解决方案,这是我的结果:

import SwiftUI
struct Movie: Identifiable {
let id = UUID()
var title: String
var year: String
}
class Model: ObservableObject {
@Published var movies: [Movie] = []
}
struct DynamicList: View {

@StateObject var model = Model()
@State var text = ""
@State var year = ""

var body: some View {
VStack {
Section() {
TextField("Title", text: $text)
.padding()
.border(.gray)
TextField("Year", text: $year)
.padding()
.border(.gray)
.keyboardType(.numberPad)
Button(action: {
self.addToList()
}, label: {
Text("Add")
.frame(width: 80, height: 40, alignment: .center)
.background(Color.blue)
.cornerRadius(8)
.foregroundColor(.white)
})
.padding()
}
List {
ForEach(model.movies) { movie in
MovieRow(title: movie.title, year: movie.year)
}
}
}
.padding()
}

func addToList() {
guard !text.trimmingCharacters(in: .whitespaces).isEmpty else {
return
}

guard !year.trimmingCharacters(in: .whitespaces).isEmpty else {
return
}

let newMovie = Movie(title: text, year: year)
model.movies.append(newMovie)
text = ""
year = ""
}

}
struct MovieRow: View {
let title: String
let year: String

var body: some View {
Label (
title: { Text(title + " " + year)},
icon: { Image(systemName: "film") }
)
}
}
struct DynamicList_Previews: PreviewProvider {
static var previews: some View {
DynamicList()
}
}

最新更新