为什么在swiftui中绑定到Picker不再起作用?

时间:2019-08-01 09:01:38

标签: swiftui

当我在模拟器或画布中运行选取器代码时,选取器总是通过动画返回到第一个选项,或者只是冻结。从上周四/周五开始发生。因此,我检查了一些旧的简单代码,在此之前它可以在哪里工作,在那儿也不适合我。 这是简单的旧代码。在beta 3、4和5中不再起作用。

protected override void OnModelCreating(ModelBuilder builder)
{
    base.OnModelCreating(builder);

    #region UserRoles

    builder.Entity<SSTRNRole>()
        .HasMany(ur => ur.Users)
        .WithOne()
        .HasForeignKey(a => a.RoleId)
        .IsRequired();

    builder.Entity<SSTRNUser>()
        .HasMany(e => e.Roles)
        .WithOne()
        .HasForeignKey(e => e.UserId)
        .IsRequired()
        .OnDelete(DeleteBehavior.Cascade);

    builder.Entity<ApplicationUserRole>(b =>
    {
        b.HasKey(r => new { r.UserId, r.RoleId });
        b.HasOne(ur => ur.Role)
            .WithMany(r => r.Users)
            .HasForeignKey(ur => ur.RoleId)
            .IsRequired();
        b.HasOne(ur => ur.User)
            .WithMany(r => r.Roles)
            .HasForeignKey(ur => ur.UserId)
            .IsRequired();

        b.ToTable("AspNetUserRoles");
    });

    #endregion

    #region Roles

    builder.Entity<SSTRNRole>(b =>
    {
        b.HasKey(r => r.Id);
        b.HasIndex(r => r.NormalizedName).HasName("RoleNameIndex").IsUnique();
        b.ToTable("AspNetRoles");
        b.Property(r => r.ConcurrencyStamp).IsConcurrencyToken();

        b.Property(u => u.Name).HasMaxLength(256);
        b.Property(u => u.NormalizedName).HasMaxLength(256);

        b.HasMany(r => r.Users).WithOne().HasForeignKey(ur => ur.RoleId).IsRequired();
        //b.HasMany(r => r.Functions).WithOne().HasForeignKey(ur => ur.RoleId).IsRequired();
    });
}

在我的较新代码中,我使用了struct PickerView : View { @State var selectedOptionIndex = 0 var body: some View { VStack { Text("Option: \(selectedOptionIndex)") Picker(selection: $selectedOptionIndex, label: Text("")) { Text("Option 1") Text("Option 2") Text("Option 3") } } } } ,但在这里也不起作用。 而且我没有任何错误,它可以构建和运行。 谢谢您的指点。

---- 编辑 ----- 请先查看答案

在获得帮助之后,我可以像所有@ObservedObject一样使用.tag()后面的Text(),现在它获取初始值并在视图内更新它。如果我像这样使用Text("Option 1").tag()

@ObservedObject

不幸的是,它不能反映出值的变化,如果我在另一视图中进行了这些更改,则进一步导航。而且,它似乎与上面的代码(我在其中使用struct PickerView: View { @ObservedObject var data: Model let width: CGFloat let height: CGFloat var body: some View { VStack(alignment: .leading) { Picker(selection: $data.exercise, label: Text("select exercise")) { ForEach(data.exercises, id: \.self) { exercise in Text("\(exercise)").tag(self.data.exercises.firstIndex(of: exercise)) } } .frame(width: width, height: (height/2), alignment: .center) } } } }

的代码不兼容)

--- 编辑 ---  现在,如果我更改,上面的代码可以工作 firstIndex(of: exercise) 进入 Text("\(exercise)").tag(self.data.exercises.firstIndex(of: exercise)) 因为它不能与可选项一起使用。

1 个答案:

答案 0 :(得分:1)

答案总结为:

  1. 在选项后面加上.tag()即可使用。看起来如下:
Picker(selection: $selectedOptionIndex, label: Text("")) {
                ForEach(1...3) { index in
                    Text("Option \(index)").tag(index)
                }
            }
  1. 如果您使用一系列对象,则可能看起来像这样:
Picker(selection: $data.exercises, label: Text("")) {
                ForEach(0..<data.exercises.count) { index in
                    Text("\(data.exercises[index])").tag(index)
                }
            }

我不确定是否打算在这里使用.tag(),但这至少是一种解决方法。