我有多个适用于 iOS 14 及更高版本用户的小部件。但对于新的锁屏小部件,它仅适用于 iOS 16 用户。如何只为 iOS 16 用户制作底部两个小部件?如果我取消注释第一行,那么我相信它将使所有小部件仅对 iOS 16 用户可用,但我不能这样做,我希望我的用户能够继续使用主屏幕小部件(如果他们使用的是 iOS 14)- 15.
import WidgetKit
import SwiftUI
//@available(iOSApplicationExtension 16.0, *)
@main
struct Widgets: WidgetBundle {
@WidgetBundleBuilder
var body: some Widget {
Widget1()
Widget2()
Widget3()
LockscreenWidget1()
LockscreenWidget2()
}
}
Run Code Online (Sandbox Code Playgroud) 我在 Xcode 14 beta 中遇到一个问题,正如您在下面的图像中看到的那样,输入一些文本后键盘会消失,而在 iOS 15 中键盘保持在原位,这是我想要的行为。
我正在做的是.onSubmit创建一个新项目并以编程方式设置它的焦点。
iOS 15(Xcode 13.4.1)
iOS 16(Xcode 14 测试版 3)
再次:
enum Focusable: Hashable {
case none
case row(id: UUID)
}
extension View {
func sync<T: Equatable>(_ field1: Binding<T>, _ field2: FocusState<T>.Binding ) -> some View {
self
.onChange(of: field1.wrappedValue) {
field2.wrappedValue = $0
}
.onChange(of: field2.wrappedValue) {
field1.wrappedValue = $0
}
}
}
class Store: ObservableObject {
struct Item: Identifiable {
var id = UUID()
var name: String
}
@Published …Run Code Online (Sandbox Code Playgroud) 我有一个带有倒计时器的小部件。我一直在使用“Text(event.startDate, style: .timer)”来更新小部件文本。但更新到 iOS 16 后,这个问题就不再起作用了。有人经历过同样的事情吗?看起来也不像是已弃用的https://developer.apple.com/documentation/swiftui/text/datestyle/timer
我正在尝试使我的 iPhone 应用程序(针对 iOS 15 及更高版本)与 iOS 16 完全兼容,但没有成功!
我不知道如何在同一段代码中同时支持NavigationViewiOS 15 和iOS 16。NavigationStack
Xcode 不接受上面的代码:
if #available(iOS 16, *) {
NavigationStack {
} else {
NavigationView {
}
Run Code Online (Sandbox Code Playgroud)
来自:SwiftUI NavigationView/Stack(如果可用)iOS 15/16
我想按照@timmy 的建议创建自定义容器将是唯一的解决方案。但我不知道如何继续。
那有什么办法解决呢?
我有一个SwiftUI Form自定义图表视图(不是Swift Charts)。长按可切换到不同类型的图表。这些图表使用.transition(.slide)修饰符。在 iOS 15 中,长按时这些会按预期进行转换,但在 iOS 16 中却不会。
持久化状态属性(枚举):
@AppStorage("chartType") var chartType: ChartType = .chartA
Run Code Online (Sandbox Code Playgroud)
Form财产部分body:
Form {
// Other sections
Section {
switch chartType {
case .chartA:
ChartViewA()
.transition(.slide)
case .chartB:
ChartViewB()
.transition(.slide)
}
.onLongPressGesture {
if chartType == .chartA {
withAnimation {
summaryChartType = .chartB
}
} else {
withAnimation {
summaryChartType = .chartA
}
}
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,添加动画修改器之类的.animation(.spring(), value: chartType)没有什么区别。
如果您能告诉我为什么这在 iOS 15 中有效但在 iOS 16 …
使用 Xcode 14.0、iOS 16、Swift 5.7、
由于 iOS 16,我收到以下弃用警告:
iOS 16.0 中已弃用“duration”:改用 load(.duration)
这是我的代码:
var actualTime: CMTime = CMTimeMake(value: 0, timescale: asset.duration.timescale)
Run Code Online (Sandbox Code Playgroud)
我需要更改什么才能消除此警告?
我试过:
var actualTime: CMTime = CMTimeMake(value: 0, timescale: asset.load(.duration).timescale)
Run Code Online (Sandbox Code Playgroud)
但这使得一切都是异步的。我真的需要走那条路吗?
我正在尝试在 Swift 项目上本地化新 SwiftUI AppIntent 的摘要,以创建新的快捷方式。
我无法本地化摘要。我已经创建了一个AppShortcuts.strings带有英语和西班牙语本地化的语言,如下所示:单击此处。
AppShortcuts.string(es):
"add ${numberOne} ${numberTwo}" = "Sumar: ${numberOne} ${numberTwo}";
Run Code Online (Sandbox Code Playgroud)
捷径:
static var parameterSummary: some ParameterSummary {
Summary("add \(\.$numberOne) \(\.$numberTwo)") {
\.$numberThree
\.$numberFour
}
}
Run Code Online (Sandbox Code Playgroud) 我遇到了我认为是 iOS16 中的一个错误:当本地化字符串从 Swift 传递到 Objective-C 并与另一个相同的本地化字符串(在 Objective-CC 中定义)进行比较时,结果可能为 false 并且参数顺序可以影响结果。看演示:
\nclass ViewController: UIViewController {\n override func viewDidLoad() {\n super.viewDidLoad()\n let tc = TestClass()\n tc.receive(NSLocalizedString("Start", comment:""))\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n@implementation TestClass\n- (void)receive:(NSString *)swiftString {\n NSString *objcString = NSLocalizedString(@"Start", @"");\n BOOL result1 = [swiftString isEqualToString:objcString];\n BOOL result2 = [objcString isEqualToString:swiftString];\n NSLog(@"result: %d, %d", result1, result2);\n}\n@end\nRun Code Online (Sandbox Code Playgroud)\n它是可本地化的(以日语为例,但拉丁语以外的任何书写系统都可以重现该错误):
\n"Start" = "\xe9\x96\x8b\xe5\xa7\x8b";\nRun Code Online (Sandbox Code Playgroud)\n输出:
\nresult: 0, 1\nRun Code Online (Sandbox Code Playgroud)\n我们不知道造成这种情况的根本原因是来自NSLocalizedString()还是-isEqualToString。iOS15 上不会发生这种情况。
还有其他人遇到过这个错误吗?
\n我正在尝试使我的应用程序适应 IOS 16 中引入的新功能。当我的一个视图中NavigationStack有一个变量时,我最终出现了奇怪的行为。@StateObject
当我导航(使用 new修饰符)到具有该对象的块.navigationDestination()的新视图时,该对象将运行两次。@StateObjectinit()
视图的主体如下所示:
VStack {
Text("Param: \(intParam) and \(viewModel.someData)")
Button("Do Something") {
viewModel.buttonTapped()
}
}
Run Code Online (Sandbox Code Playgroud)
如果我删除 Button 元素,则init()只会@StateObject运行一次。
如果我使用旧NavigationLink(title:destination:)元素导航到新页面,它将运行一次@StateObject init()。
struct ContentView: View {
var body: some View {
NavigationStack {
VStack {
NavigationLink(value: 16) {
Text("Tap Me (IOS 16)")
}
NavigationLink("Tap Me (Older)") {
Page2(intParam: 45)
}
}
.navigationDestination(for: Int.self) { i in
Page2(intParam: i)
} …Run Code Online (Sandbox Code Playgroud)