I have a Slider,
it’s setting the value from hardcode @State private var vampiresCount = 3.0.
Now I have CoreData for Players, it’s saving Players names (tags) and I want to checking the players count in Slider, never before doing it and can’t find a solution. Thanks for any help!
P.s.: I expect the Slider will be output the values stored in CoreData, after the user has specified the number of players in PlayersView from 3 to 10.
1. Slider logic:
HStack {
Text("Игроки:") //"Players"
.fontWeight(.bold)
.foregroundStyle(Color(.black).opacity(0.8))
if vampiresCount == 10.0 { //checking players count in CoreData
Text("max")
.font(.title2)
} else {
Text("(Int(vampiresCount))")
.font(.title2)
}
}
HStack {
Text("min")
Slider(value: $vampiresCount, in: 3...10.0 //players count in CD
)
.frame(width: 280)
.tint(.orange)
Text("10")
}
HStack {
Text("Охотники:") //"Hunters"
.fontWeight(.bold)
.foregroundStyle(Color(.black).opacity(0.8))
HStack {
if vampiresCount <= 4 { //players count in CD
Text("1")
.font(.title2)
} else if vampiresCount > 4 && vampiresCount <= 6 {
Text("1-2")
.font(.title2)
} else if vampiresCount > 6 && vampiresCount <= 8 {
Text("1-3")
.font(.title2)
} else {
Text("1-4")
.font(.title2)
}
}
}
}
.padding(.bottom, 100)
.frame(maxWidth: .infinity, maxHeight: .infinity)
.background(Color(#colorLiteral(red:0.8980392157, green: 0.9333333333, blue: 1, alpha: 1)))
}
}
- Player+CoreDataProperties
import Foundation
import CoreData
extension Player {
@nonobjc public class func fetchRequest() -> NSFetchRequest<Player> {
return NSFetchRequest<Player>(entityName: "Player")
}
@NSManaged public var name: String?
}
extension Player : Identifiable {
}
- TagsViewModel
import SwiftUI
import Combine
import CoreData
class TagsViewModel: ObservableObject {
@Published var tag: String = ""
@Published var rows: [[TagItem]] = []
@Published var tags: [TagItem] = []
private let viewContext = PersistenceController.shared.container.viewContext
private let fetchRequest = Player.fetchRequest()
init() {
seed()
prepareTagsList()
}
func addTag() {
let newPlayer = Player(context: viewContext)
newPlayer.name = tag
do {
try viewContext.save()
} catch {
let nsError = error as NSError
fatalError("Unresolved error (nsError), (nsError.userInfo)")
}
tag = ""
prepareTagsList()
}
func removeTag(by id: NSManagedObjectID) {
let player = viewContext.object(with: id)
viewContext.delete(player)
do {
try viewContext.save()
} catch {
let nsError = error as NSError
fatalError("Unresolved error (nsError), (nsError.userInfo)")
}
prepareTagsList()
}
func prepareTagsList() {
let players = try? viewContext.fetch(fetchRequest)
if let players = players, !players.isEmpty {
tags = players.map({ player in
return TagItem(name: player.name ?? "", managedObjectId: player.objectID)
})
}
var rows: [[TagItem]] = []
var curRow: [TagItem] = []
let screenWidth = UIScreen.getScreenWidth() - 20
if !tags.isEmpty {
for index in 0..<tags.count {
self.tags[index].size = tags[index].name.getSize()
}
var totalWidth: CGFloat = 0
let spacing: CGFloat = 65
tags.forEach { tag in
totalWidth += (tag.size + spacing)
if totalWidth > screenWidth {
totalWidth = (tag.size + spacing)
rows.append(curRow)
curRow.removeAll()
}
curRow.append(tag)
}
if !curRow.isEmpty {
rows.append(curRow)
curRow.removeAll()
}
}
self.rows = rows
}
private func seed() {
let fetchRequest = Player.fetchRequest()
let players = try? viewContext.fetch(fetchRequest)
if let players = players, players.isEmpty {
let player1 = Player(context: viewContext)
player1.name = "Юля"
let player2 = Player(context: viewContext)
player2.name = "Антон"
let player3 = Player(context: viewContext)
player3.name = "Илья"
let player4 = Player(context: viewContext)
player4.name = "Арсений"
let player5 = Player(context: viewContext)
player5.name = "Петя"
do {
try viewContext.save()
} catch {
let nsError = error as NSError
fatalError("Unresolved error (nsError), (nsError.userInfo)")
}
}
}
}
1