我有一个主类,也提供了一个命名空间:
class A {
}
Run Code Online (Sandbox Code Playgroud)
和一个通过扩展添加的嵌套类(所有这些都是为了使用单独的文件):
extension A {
class B {
}
}
Run Code Online (Sandbox Code Playgroud)
我想通过扩展它来为嵌套类(B)添加功能; 我试过了:
extension A.B {
}
Run Code Online (Sandbox Code Playgroud)
我得到"'B'不是'A'的成员类型".
(我也尝试了一些不太合理的东西,但我会在这里省略它们以避免尴尬.阅读Swift文档和谷歌搜索"快速嵌套类扩展"也没有得出答案.)
知道是否以及如何实现这一目标?
更新:
感谢user3441734试用它时,此代码在单个文件(或Playground)中按预期工作!
当3个部分位于单独的文件中时仍然不起作用,可能是当前Swift编译器实现中的一个错误.我将向Apple提交一份错误报告.
这是一个有趣的困境:我想制作一个可靠地“滴答”的计时器,但同时也在可预测的位置渲染符号,以便我可以通过添加背景来装饰计时器。由于 WidgetKit 的限制,我无法可靠地每秒渲染自己的文本,并且必须依赖特殊视图,例如Text(Date(), style: .timer)。但是,此视图可以根据剩余时间将时间呈现为XX:XX和X:XX ,这没问题,但它也占用容器的整个宽度并左对齐,这使得最后一个:XX根据剩余时间移动。
\n这是一个例子:
\n\n以及生成它的代码:
\nstruct MyWidgetEntryView : View { \n var body: some View {\n VStack {\n Text(Date().addingTimeInterval(1000), style: .timer)\n .font(.body.monospacedDigit())\n .background(Color.red)\n \n Text(Date().addingTimeInterval(100), style: .timer)\n .background(Color.green)\n .font(.body.monospacedDigit())\n }\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n问题:有没有一种方法可以在 WidgetKit 小部件中可靠地更新时间显示,使分钟和秒的符号始终呈现在相同的位置,并且不会根据剩余时间而移动?
\n我无法弄清楚,请帮助我!
\n\xe2\x80\x93巴格兰
\n作为我学习新技术的努力的一部分,我正在尝试在 SwiftUI 中实现我正在开发的应用程序的屏幕之一。我有这个粗略的布局:
此元素应拉伸以适应容器大小(不同宽度的设备),并将在 ScrollView 中使用。
这是我在一些绊脚石后想出的初步解决方案:
这对于第一次尝试来说效果很好,但我想通过将所有相关部分移动到一个单独的视图中来重构视图。除此之外,我希望新视图能够自动考虑我稍后可能添加的填充和其他大小修改。
所以,这是一个天真的重写:
正如您很容易发现的那样,ScrollView 中的 GeometryReader 假定父级提供的大小,有效地隐藏了大部分 View。
这种情况有几种“肮脏”的解决方案:为 View 设置一个固定的框架高度,设置一个接近正确大小的纵横比(考虑到有固定高度的 Text 视图,这有点棘手),保持 GeometryReader 作为最外层主视图的元素并将宽度作为初始化参数传递给子视图。
我正在为这个特定的布局寻找一个“干净”的解决方案,也许是为了更全面地了解 Views 是如何 SwiftUI 调节它们的大小的——在 WWDC 视频中,据说父 View 提出了一个大小,但随后子 View 返回了它自己的尺寸;有没有办法以某种方式干预该过程,还是全部通过私有 API 完成?
谢谢!
–巴格兰
ps 我认为除了 UI 预览之外的代码截图是最能说明问题的,但如果我也应该提供代码片段,请告诉我!
在我正在开发的一个应用程序中,有一个部分主要是“前进”导航——点击按钮会显示下一张幻灯片。但是,还需要辅助“向后”导航。这是我使用的方法:
import SwiftUI
struct Sample: View {
@State private var dragOffset: CGFloat = -100
var body: some View {
VStack {
Text("Perhaps a title")
ScrollView {
VStack {
Text("Some scrollable content is going to be here")
// ...
Button(action: {
// Go to the next slide
}) { Text("Next") }
}
}
Text("and, maybe, something else")
}
.overlay(
Image(systemName: "arrow.left").offset(x: dragOffset / 2),
alignment: .leading
)
.gesture(
DragGesture()
.onChanged{
self.dragOffset = $0.translation.width
}
.onEnded {
self.dragOffset = -100 // Hide …Run Code Online (Sandbox Code Playgroud)