如何解决SwiftUI:仅在第一次尝试时打开带有动态内容的模式表失败
目标是将动态内容传递到单个模式中,就像它是详细视图一样:
library(ggplot2)
library(shiny)
ui <- fluidPage(
fluidRow(
column(width = 6,plotOutput("plot1",height = 350,click = "plot1_click"),numericInput("number",label = NULL,value = 4,step = 2,max = 8)
)
)
)
server <- function(input,output) {
# For storing which rows have been excluded
vals <- reactiveValues(keeprows=logical(0),data=mtcars[0,])
output$plot1 <- renderPlot({
keep <- vals$data[ vals$keeprows,drop = FALSE]
exclude <- vals$data[!vals$keeprows,drop = FALSE]
print(keep)
ggplot(keep,aes(wt,mpg,colour=as.factor(cyl))) + geom_point(data=keep) + geom_line(data=keep) +
geom_point(data = exclude,shape = 21,fill = NA,color = "black",alpha = 0.25)
})
# Toggle points that are clicked
observeEvent(input$plot1_click,{
res <- nearPoints(vals$data,input$plot1_click,allRows = TRUE)
vals$keeprows <- xor(vals$keeprows,res$selected_)
})
#attempt to capture keeprows across plots
observeEvent(input$number,{
#get the id (here rownames) of the points excluded by the user
excluded_ids <- rownames(vals$data)[!vals$keeprows]
#make the new data
vals$data=mtcars[mtcars$cyl %in% input$number,]
#keep the rows that the user had not previously excluded.
vals$keeprows = !(rownames(vals$data) %in% excluded_ids)
})
}
shinyApp(ui,server)
由于某种原因,第一次点击一个单元格时,模态为空,好像状态在呈现模态内容之前未更新,但是在此之后的任何时候都可以正常工作。我是否遗漏了明显的东西,还是应该提起雷达?
解决方法
这是多页冲突,因为您将同一工作表附加到ForEach
中的每个单元格并绑定到单个状态,因此单击时它们都立即被激活。解决方法是将工作表移出ForEach
这是已更正的部分。经过Xcode 12 / iOS 14的测试
var body: some View {
ScrollView {
LazyVGrid(columns: columns) {
ForEach(items.collection,id: \.id) {item in
Text(item.number)
.frame(height: 100)
.onTapGesture {
self.selectedItem = item
self.showingFull = true
}
}
}
}
.sheet(isPresented: $showingFull) { // << here !!
if let item = selectedItem {
Text(item.number)
}
}
}
,
我发现的一种可能的解决方案是将工作表和状态移动为其自己的结构:
struct ContentView: View {
@ObservedObject var items: ItemSet
init() {
self.items = ItemSet()
}
var columns = [
GridItem(.adaptive(minimum: 150),spacing: 5.0)
]
var body: some View {
ScrollView {
LazyVGrid(columns: columns) {
ForEach(items.collection,id: \.id) {item in
TextItem(item: item)
}
}
}
}
}
struct TextItem: View {
let item: Item
@State private var showingFull = false
var body: some View {
Text(item.number)
.frame(height: 100)
.onTapGesture {
self.showingFull = true
}
.sheet(isPresented: $showingFull) {
Text(item.number)
}
}
}
我不知道该解决方案在正确的SwiftUI方面有多“正确”,但是在更复杂,更笨重的布局中使用时,我还没有注意到任何性能问题。
,遇到同样的问题并通过切换到 sheet(item)
并删除布尔检查以显示工作表来解决
struct TextItem: View {
@State let item: Item
var body: some View {
Text(item.number)
.frame(height: 100)
.onTapGesture {
self.showingFull = true
}
.sheet($item) {
Text($0.number)
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。