Swift 进度视图值更改问题

Swift 进度视图值更改问题,swift,swiftui,Swift,Swiftui,我开发了一个从列表页面导航的编辑页面。但是,当我在此页面中添加进度视图时,我希望它可以像这样实现: 我使用movie.grenzen显示进度视图 在增量进度按钮操作中,我需要执行movie.grenzen+0.1,然后movie.grenzen作为结果需要重新存储到核心数据中 我遇到了一些问题: 如果self.movie.grenzen=0.8{ 返回UIColor.init(红色:75/255,绿色:125/255,蓝色:45/255,alpha:1) } 如果grenzen>=0.7{

我开发了一个从列表页面导航的编辑页面。但是,当我在此页面中添加进度视图时,我希望它可以像这样实现:

  • 我使用movie.grenzen显示进度视图
  • 在增量进度按钮操作中,我需要执行movie.grenzen+0.1,然后movie.grenzen作为结果需要重新存储到核心数据中
我遇到了一些问题:

  • 如果self.movie.grenzen<1{
    标准不起作用。总是超出范围
  • 进度视图不会随值的增加而改变
  • 返回上一页后,movie.grenzen的更新值不能反映为其他文本字段
  • 保存更改,无法自动返回上一页
EditView

import SwiftUI

struct EntscheidenEdt: View {
  @Environment(\.managedObjectContext) var managedObjectContext
  static let DefaultMovieTitle = "An untitled plan"
  static let DefaultMovieGenre = "Genre-buster"
  @Binding var movie : Movie
  @State private var showAlert = false
  @State private var progress = 0.0
  
  private var adapterValue: Binding<Double> {
    Binding<Double>(get: { self.movie.grenzen },
                    set: { self.movie.grenzen = $0})
  }
  init(_ movie: Binding<Movie>){
    self._movie = movie
  }
  
  var alert: Alert {
    Alert(title: Text("Alert Window"), message: Text("Go for it! "),
          dismissButton: .default(Text("Dismiss")))
  }
  
  var body: some View {
    NavigationView {
      Form {
        Section(header: Text("Enscheiden")) {
          TextField("Title", text: $movie.title ?? "An untitled plan")
        }
        Section(header: Text("Genre")) {
          TextField("Genre", text: $movie.genre ?? "Genre-buster")
        }
        Section {
          DatePicker(
            selection: $movie.releaseDate ?? Date.init(),
            displayedComponents: .date) {
            Text("Date").foregroundColor(Color(.gray))
          }
        }
        Section {
          VStack(spacing: 30) {
            // 2.
            if #available(iOS 14.0, *) {
              ProgressView("Progress", value: self.movie.grenzen, total: 1)
            } else {
              // Fallback on earlier versions
            }
            
            // 3.
            Button("Increment Progress") {
              if self.movie.grenzen < 1 {
                self.movie.grenzen += 0.1
              }
            }
            // 4.
            Text("Current Progress: \(self.movie.grenzen * 100, specifier: "%.0f") %")
            Spacer()
          }
          .padding(.all, 10)
        }
        Section {
          Button(action: EntscheidenWechselAction) {
            Text("Entscheiden!")
          }.alert(isPresented: $showAlert, content: { self.alert })
        }
      }
      .navigationBarTitle(Text("Entscheidung Wechsel"), displayMode: .inline)
    }
  }
  
  //need to inform user Save seccuss!
  private func EntscheidenWechselAction() {
    showAlert = true
  }
}
**import SwiftUI**

struct MovieRow: View {
  @Environment(\.managedObjectContext) var managedObjectContext
  @State var movie: Movie
  static let releaseFormatter: DateFormatter = {
    let formatter = DateFormatter()
    formatter.dateStyle = .long
    return formatter
  }()
  
  var body: some View {
    NavigationLink(destination: EntscheidenEdt(self.$movie)){
      VStack(alignment: .leading) {
        HStack{
          movie.title.map(Text.init)
            .font(.system(size: 18))
          Spacer()
          ZStack {
            Circle()
              .stroke(lineWidth: 10.0)
              .opacity(0.3)
              .foregroundColor(Color(settingByColor(grenzen:movie.grenzen)))
            
            Circle()
              .trim(from: 0.0, to: CGFloat(min(movie.grenzen, 1.0)))
              .stroke(style: StrokeStyle(lineWidth: 13.0, lineCap: .round, lineJoin: .round))
              .foregroundColor(Color(settingByColor(grenzen:movie.grenzen)))
              .rotationEffect(Angle(degrees: 270.0))
              .animation(.linear)
            
            Text(String(format: "%.0f %%", min(movie.grenzen, 1.0)*100.0)).font(.system(size: 9))
              .font(.body)
              .bold()
          }.frame(width: 20.0, height: 20.0)
          .padding(5.0)
        }
        movie.releaseDate.map { Text(Self.releaseFormatter.string(from: $0)) }
          .font(.caption)
        Spacer()
        //Keep it for additional information
        //            movie.genre.map(Text.init)
        //              .font(.body)
      }
    }
  }
  
  //Setting up Circle foregroundColors with different "Grenzen"
  func settingByColor(grenzen:Double) -> UIColor {
    if grenzen >= 0.8 {
      return UIColor.init(red: 75/255, green: 125/255, blue: 45/255, alpha: 1)
    }
    if grenzen >= 0.7 {
      return UIColor.init(red: 115/255, green: 190/255, blue: 35/255, alpha: 1)
    }
    if grenzen >= 0.6 {
      return UIColor.init(red: 160/255, green: 225/255, blue: 100/255, alpha: 1)
    }
    if grenzen >= 0.5 {
      return UIColor.init(red: 210/255, green: 240/255, blue: 185/255, alpha: 1)
    }
    if grenzen == 0.5 {
      return UIColor.init(red: 240/255, green: 240/255, blue: 240/255, alpha: 1)
    }
    if grenzen > 0.3 && grenzen <= 0.4 {
      return UIColor.init(red: 255/255, green: 110/255, blue: 110/255, alpha: 1)
    }
    if grenzen > 0.2 && grenzen <= 0.3 {
      return UIColor.init(red: 255/255, green: 0/255, blue: 0/255, alpha: 1)
    }
    if grenzen <= 0.2 {
      return UIColor.init(red: 205/255, green: 0/255, blue: 0/255, alpha: 1)
    }
    else {
      return UIColor.init(red: 0/255, green: 0/255, blue: 0/255, alpha: 1)
    }
  }
}
导入快捷界面
结构entscheidedt:视图{
@环境(\.managedObjectContext)变量managedObjectContext
静态let DefaultMovieTitle=“无标题计划”
静态let DefaultMovieGenre=“流派破坏者”
@电影:电影
@状态私有变量showAlert=false
@国家私有风险值进度=0.0
私有变量adapterValue:绑定{
绑定(get:{self.movie.grenzen},
集合:{self.movie.grenzen=$0})
}
初始化(电影:绑定){
self.\u movie=电影
}
var警报:警报{
警报(标题:文本(“警报窗口”)、消息:文本(“加油!”),
解雇按钮:。默认值(文本(“解雇”))
}
var body:一些观点{
导航视图{
形式{
节(标题:文本(“Enscheiden”)){
TextField(“Title”,text:$movie.Title??“无标题计划”)
}
章节(标题:文本(“类型”)){
文本字段(“流派”,文本:$movie.Genre??“流派破坏者”)
}
部分{
日期选择器(
选择:$movie.releaseDate??Date.init(),
displayedComponents:。日期){
文本(“日期”).foregroundColor(颜色(.灰色))
}
}
部分{
VStack(间距:30){
// 2.
如果可用(iOS 14.0,*){
ProgressView(“进度”,值:self.movie.grenzen,总计:1)
}否则{
//对早期版本的回退
}
// 3.
按钮(“增量进度”){
如果self.movie.grenzen<1{
self.movie.grenzen+=0.1
}
}
// 4.
文本(“当前进度:\(self.movie.grenzen*100,说明符:%.0f”)%”)
垫片()
}
.padding(.all,10)
}
部分{
按钮(操作:EntscheidenWechselAction){
文本(“Entscheiden!”)
}.alert(显示:$showAlert,内容:{self.alert})
}
}
.navigationBarTitle(文本(“Entscheidung Wechsel”),显示模式:。内联)
}
}
//需要通知用户保存密码!
私有函数EntscheidenWechselAction(){
showarert=true
}
}
MovieRow

import SwiftUI

struct EntscheidenEdt: View {
  @Environment(\.managedObjectContext) var managedObjectContext
  static let DefaultMovieTitle = "An untitled plan"
  static let DefaultMovieGenre = "Genre-buster"
  @Binding var movie : Movie
  @State private var showAlert = false
  @State private var progress = 0.0
  
  private var adapterValue: Binding<Double> {
    Binding<Double>(get: { self.movie.grenzen },
                    set: { self.movie.grenzen = $0})
  }
  init(_ movie: Binding<Movie>){
    self._movie = movie
  }
  
  var alert: Alert {
    Alert(title: Text("Alert Window"), message: Text("Go for it! "),
          dismissButton: .default(Text("Dismiss")))
  }
  
  var body: some View {
    NavigationView {
      Form {
        Section(header: Text("Enscheiden")) {
          TextField("Title", text: $movie.title ?? "An untitled plan")
        }
        Section(header: Text("Genre")) {
          TextField("Genre", text: $movie.genre ?? "Genre-buster")
        }
        Section {
          DatePicker(
            selection: $movie.releaseDate ?? Date.init(),
            displayedComponents: .date) {
            Text("Date").foregroundColor(Color(.gray))
          }
        }
        Section {
          VStack(spacing: 30) {
            // 2.
            if #available(iOS 14.0, *) {
              ProgressView("Progress", value: self.movie.grenzen, total: 1)
            } else {
              // Fallback on earlier versions
            }
            
            // 3.
            Button("Increment Progress") {
              if self.movie.grenzen < 1 {
                self.movie.grenzen += 0.1
              }
            }
            // 4.
            Text("Current Progress: \(self.movie.grenzen * 100, specifier: "%.0f") %")
            Spacer()
          }
          .padding(.all, 10)
        }
        Section {
          Button(action: EntscheidenWechselAction) {
            Text("Entscheiden!")
          }.alert(isPresented: $showAlert, content: { self.alert })
        }
      }
      .navigationBarTitle(Text("Entscheidung Wechsel"), displayMode: .inline)
    }
  }
  
  //need to inform user Save seccuss!
  private func EntscheidenWechselAction() {
    showAlert = true
  }
}
**import SwiftUI**

struct MovieRow: View {
  @Environment(\.managedObjectContext) var managedObjectContext
  @State var movie: Movie
  static let releaseFormatter: DateFormatter = {
    let formatter = DateFormatter()
    formatter.dateStyle = .long
    return formatter
  }()
  
  var body: some View {
    NavigationLink(destination: EntscheidenEdt(self.$movie)){
      VStack(alignment: .leading) {
        HStack{
          movie.title.map(Text.init)
            .font(.system(size: 18))
          Spacer()
          ZStack {
            Circle()
              .stroke(lineWidth: 10.0)
              .opacity(0.3)
              .foregroundColor(Color(settingByColor(grenzen:movie.grenzen)))
            
            Circle()
              .trim(from: 0.0, to: CGFloat(min(movie.grenzen, 1.0)))
              .stroke(style: StrokeStyle(lineWidth: 13.0, lineCap: .round, lineJoin: .round))
              .foregroundColor(Color(settingByColor(grenzen:movie.grenzen)))
              .rotationEffect(Angle(degrees: 270.0))
              .animation(.linear)
            
            Text(String(format: "%.0f %%", min(movie.grenzen, 1.0)*100.0)).font(.system(size: 9))
              .font(.body)
              .bold()
          }.frame(width: 20.0, height: 20.0)
          .padding(5.0)
        }
        movie.releaseDate.map { Text(Self.releaseFormatter.string(from: $0)) }
          .font(.caption)
        Spacer()
        //Keep it for additional information
        //            movie.genre.map(Text.init)
        //              .font(.body)
      }
    }
  }
  
  //Setting up Circle foregroundColors with different "Grenzen"
  func settingByColor(grenzen:Double) -> UIColor {
    if grenzen >= 0.8 {
      return UIColor.init(red: 75/255, green: 125/255, blue: 45/255, alpha: 1)
    }
    if grenzen >= 0.7 {
      return UIColor.init(red: 115/255, green: 190/255, blue: 35/255, alpha: 1)
    }
    if grenzen >= 0.6 {
      return UIColor.init(red: 160/255, green: 225/255, blue: 100/255, alpha: 1)
    }
    if grenzen >= 0.5 {
      return UIColor.init(red: 210/255, green: 240/255, blue: 185/255, alpha: 1)
    }
    if grenzen == 0.5 {
      return UIColor.init(red: 240/255, green: 240/255, blue: 240/255, alpha: 1)
    }
    if grenzen > 0.3 && grenzen <= 0.4 {
      return UIColor.init(red: 255/255, green: 110/255, blue: 110/255, alpha: 1)
    }
    if grenzen > 0.2 && grenzen <= 0.3 {
      return UIColor.init(red: 255/255, green: 0/255, blue: 0/255, alpha: 1)
    }
    if grenzen <= 0.2 {
      return UIColor.init(red: 205/255, green: 0/255, blue: 0/255, alpha: 1)
    }
    else {
      return UIColor.init(red: 0/255, green: 0/255, blue: 0/255, alpha: 1)
    }
  }
}
**导入快捷界面**
struct MovieRow:视图{
@环境(\.managedObjectContext)变量managedObjectContext
@国家电影:电影
静态let releaseFormatter:DateFormatter={
let formatter=DateFormatter()
formatter.dateStyle=.long
返回格式化程序
}()
var body:一些观点{
导航链接(目的地:entscheidendet(self.$movie)){
VStack(对齐:。前导){
HStack{
movie.title.map(Text.init)
.font(.system(大小:18))
垫片()
ZStack{
圈()
.笔划(线宽:10.0)
.不透明度(0.3)
.foregroundColor(颜色(按颜色设置(grenzen:movie.grenzen)))
圈()
.trim(从:0.0到:CGFloat(最小值(movie.grenzen,1.0)))
.stroke(样式:StrokeStyle(线宽:13.0,线帽:。圆形,线连接:。圆形))
.foregroundColor(颜色(按颜色设置(grenzen:movie.grenzen)))
.旋转效应(角度(度:270.0))
.动画(.linear)
文本(字符串(格式:%.0f%%),最小值(movie.grenzen,1.0)*100.0)).font(.system(大小:9))
.font(.body)
.bold()
}.框架(宽度:20.0,高度:20.0)
.填充(5.0)
}
movie.releaseDate.map{Text(Self.releaseFormatter.string(from:$0))}
.font(.caption)
垫片()
//保留它以获取更多信息
//movie.genre.map(Text.init)
//.font(.body)
}
}
}
//使用不同的“Grenzen”设置圆形背景颜色
func settingByColor(灰色:双色)->UIColor{
如果grenzen>=0.8{
返回UIColor.init(红色:75/255,绿色:125/255,蓝色:45/255,alpha:1)
}
如果grenzen>=0.7{
返回UIColor.init(红色:115/255,绿色:190/255,蓝色:35/255,alpha:1)
}
如果grenzen>=0.6{
返回UIColor.init(红色:160/255,绿色:225/255,蓝色:100/255,alpha:1)
}
如果grenzen>=0.5{
返回UIColor.init(红色:210/255,绿色:240/255,蓝色:185/255,alpha:1)
}
如果grenzen==0.5{
返回UIColor.init(红色:240/255,绿色:240/255,蓝色:240/255,alpha:1)
}

如果grenzen>0.3&&grenzen 0.2&&grenzen显示
电影的代码
@jnpdx hi,请在此处查看我的代码。我仍然看不到电影的代码。请缩减所需的代码