当我在模拟器或画布中运行选取器代码时,选取器总是通过动画返回到第一个选项,或者只是冻结。从上周四/周五开始发生。因此,我检查了一些旧的简单代码,在此之前它可以在哪里工作,在那儿也不适合我。 这是简单的旧代码。在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))
因为它不能与可选项一起使用。
答案 0 :(得分:1)
答案总结为:
.tag()
即可使用。看起来如下:Picker(selection: $selectedOptionIndex, label: Text("")) {
ForEach(1...3) { index in
Text("Option \(index)").tag(index)
}
}
Picker(selection: $data.exercises, label: Text("")) {
ForEach(0..<data.exercises.count) { index in
Text("\(data.exercises[index])").tag(index)
}
}
我不确定是否打算在这里使用.tag()
,但这至少是一种解决方法。