标签: ios16

锁屏 swift 小部件仅适用于 iOS 16 用户

我有多个适用于 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)

iphone ios swift swiftui ios16

6
推荐指数
1
解决办法
1832
查看次数

在 iOS 16 中设置新的文本字段焦点时,文本字段被忽略

我在 Xcode 14 beta 中遇到一个问题,正如您在下面的图像中看到的那样,输入一些文本后键盘会消失,而在 iOS 15 中键盘保持在原位,这是我想要的行为。

我正在做的是.onSubmit创建一个新项目并以编程方式设置它的焦点。

iOS 15(Xcode 13.4.1)

iOS 15

iOS 16(Xcode 14 测试版 3)

iOS 16

再次:

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)

keyboard textfield swiftui ios16

6
推荐指数
0
解决办法
1043
查看次数

SwiftUI 小部件 Text.DateStyle 在 iOS 16 中不起作用

我有一个带有倒计时器的小部件。我一直在使用“Text(event.startDate, style: .timer)”来更新小部件文本。但更新到 iOS 16 后,这个问题就不再起作用了。有人经历过同样的事情吗?看起来也不像是已弃用的https://developer.apple.com/documentation/swiftui/text/datestyle/timer

xcode widget swiftui ios16

6
推荐指数
0
解决办法
482
查看次数

iOS 15/16 的 SwiftUI NavigationView 与 NavigationStack

我正在尝试使我的 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 的建议创建自定义容器将是唯一的解决方案。但我不知道如何继续。

那有什么办法解决呢?

xcode navigationview swiftui ios15 ios16

6
推荐指数
1
解决办法
1万
查看次数

过渡动画在 iOS16 中不起作用,但在 iOS15 中起作用

我有一个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 …

animation ios swift swiftui ios16

6
推荐指数
1
解决办法
1980
查看次数

如何在 iOS 16 的 iPad 上返回标题下的 UISearchController?

在 iPad 上,iOS 16 searchController 显示在右侧。像这样: 浏览器风格

如何返回 searchController 的“默认”视图?像这样: 标题下的 UISearchController

styles ipad swift uisearchcontroller ios16

6
推荐指数
1
解决办法
875
查看次数

iOS 16 弃用 asset.duration

使用 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)

但这使得一切都是异步的。我真的需要走那条路吗?

ios avasset swift ios16

6
推荐指数
1
解决办法
4206
查看次数

SwiftUI AppIntents iOS16:如何本地化摘要?

我正在尝试在 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)

shortcut android-intent swift ios16

6
推荐指数
1
解决办法
482
查看次数

NSLocalizedString 从 Swift 传递到 Objective-C 时可能存在 iOS 16 错误

我遇到了我认为是 iOS16 中的一个错误:当本地化字符串从 Swift 传递到 Objective-C 并与另一个相同的本地化字符串(在 Objective-CC 中定义)进行比较时,结果可能为 false 并且参数顺序可以影响结果。看演示:

\n
class ViewController: UIViewController {\n    override func viewDidLoad() {\n        super.viewDidLoad()\n        let tc = TestClass()\n        tc.receive(NSLocalizedString("Start", comment:""))\n    }\n}\n
Run 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\n
Run Code Online (Sandbox Code Playgroud)\n

它是可本地化的(以日语为例,但拉丁语以外的任何书写系统都可以重现该错误):

\n
"Start" = "\xe9\x96\x8b\xe5\xa7\x8b";\n
Run Code Online (Sandbox Code Playgroud)\n

输出:

\n
result: 0, 1\n
Run Code Online (Sandbox Code Playgroud)\n

我们不知道造成这种情况的根本原因是来自NSLocalizedString()还是-isEqualToString。iOS15 上不会发生这种情况。

\n

还有其他人遇到过这个错误吗?

\n

objective-c nslocalizedstring swift ios16

6
推荐指数
1
解决办法
473
查看次数

SwiftUI - IOS 16 NavigationStack - @StateObject init 被调用两次

描述

我正在尝试使我的应用程序适应 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)

ios swift swiftui ios16 swiftui-navigationstack

6
推荐指数
1
解决办法
999
查看次数