我的视图需要一个环境对象,它通过将它添加到 window.rootViewController 在 SceneDelegate 中设置。如何设置用于预览的环境对象?
我正在为我的 SwiftUI 应用程序使用视图模型,并且希望在视图模型中也具有焦点状态,因为表单非常复杂。
在视图中使用 @FocusState 的实现按预期工作,但不是我想要的:
import Combine
import SwiftUI
struct ContentView: View {
@ObservedObject private var viewModel = ViewModel()
@FocusState private var hasFocus: Bool
var body: some View {
Form {
TextField("Text", text: $viewModel.textField)
.focused($hasFocus)
Button("Set Focus") {
hasFocus = true
}
}
}
}
class ViewModel: ObservableObject {
@Published var textField: String = ""
}
Run Code Online (Sandbox Code Playgroud)
如何将 @FocusState 放入视图模型中?
我有一个端点用于创建地址和一个用于更新地址。在 OpenAPI 规范中对此进行描述时,我想使用地址组件,这样我就不必两次指定地址。现在的问题是,用于更新的地址对象应该包含属性“id”,但用于创建的地址对象却没有。
所以基本上,我正在寻找一种方法来描述组件部分中的完整地址(包括 id 属性),然后引用创建端点,但不包括那里的“id”属性。
我正在为我的 API 请求使用 Swift Combine。现在我面临的情况是,我想要将 4 个以上的并行请求压缩在一起。在我使用 Zip4() 运算符将 4 个请求压缩在一起之前。我可以想象您分多个步骤进行压缩,但我不知道如何为其编写 receiveValue。
这是我当前代码的简化,包含 4 个并行请求:
Publishers.Zip4(request1, request2, request3, request4)
.sink(receiveCompletion: { completion in
// completion code if all 4 requests completed
}, receiveValue: { request1Response, request2Response, request3Response, request4Response in
// do something with request1Response
// do something with request2Response
// do something with request3Response
// do something with request4Response
}
)
.store(in: &state.subscriptions)
Run Code Online (Sandbox Code Playgroud) 我正在将 SwiftUI iOS 应用程序移植到 macOS。它使用 @UIApplicationDelegateAdaptor 属性包装器来绑定 UIApplicationDelegate 类。不幸的是,UIApplicationDelegate 类在 macOS 上不可用,所以我想知道如何绑定我的自定义 AppDelegate。
class AppDelegate: NSObject, UIApplicationDelegate {
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil) -> Bool {
...
}
}
struct MyApp: App {
@UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
var body: some Scene {
...
}
}
Run Code Online (Sandbox Code Playgroud) 我想使用 onIncrement 和 onDecrement 在手动(非绑定)模式下使用步进视图。当我尝试实现下限和上限时,会出现奇怪的行为,例如。年龄值不低于 1 或高于 10。
如果您尝试以下代码,则可以在其值已为“1”后按两次“-”。它并没有像预期的那样低于 1,但是在再按两次之后,“-”按钮突然被禁用。如果您随后按“+”,则不会发生任何事情。仅在再按 2 次“+”后,计数器才会按预期做出反应并变为 2。
这是一个错误吗?
struct StepperTest: View {
@State private var age = 5
var body: some View {
VStack {
Stepper("Enter your age", onIncrement: {
if self.age < 10 {
self.age += 1
print("Adding to age")
}
}, onDecrement: {
guard self.age > 1 else { return }
self.age -= 1
print("Subtracting from age")
})
Text("Your age is \(age)")
}
}
}
Run Code Online (Sandbox Code Playgroud) 我在这里已经阅读了很多有关SwiftUI中导航的信息,并尝试了几件事,但是没有任何工作可以按需进行。
基本上,我有一个包含锻炼列表的视图,您可以通过单击一行来显示一个锻炼。使用NavigationView和NavigationLink可以按预期工作。
现在,我要在详细信息视图上单击一个按钮以开始锻炼。这应该打开一个带有计时器的视图。该视图应显示与详细视图相同的动画,并在导航栏中使用后退按钮显示锻炼的名称。
我可以在详细信息页面上的NavigationLink视图中实现此功能,但是该链接始终显示为全宽行,并在右侧显示箭头。我希望这是一个按钮,但是NavigationLink似乎可以抵抗样式。
struct WorkoutDetail: View {
var workout: Workout
var body: some View {
VStack {
NavigationLink(destination: TimerView()) {
Text("Starten")
}.navigationBarTitle(Text(workout.title))
}
}
}
struct WorkoutList: View {
var workoutCollection: WorkoutCollection
var body: some View {
NavigationView {
List(workoutCollection.workouts) { workout in
NavigationLink(destination: WorkoutDetail(workout: workout)) {
WorkoutRow(workout: workout)
}
}.navigationBarTitle(Text("Workouts"))
}
}
}
Run Code Online (Sandbox Code Playgroud)
更新:这是一个截图,以说明我的意思:
将标准按钮样式替换为自定义按钮样式后,该按钮在 tvOS 上不再可选(它在 iOS 上按预期工作)。PlainButtonStyle() 中是否有我缺少的特殊修饰符?或者这是 SwiftUI 中的一个错误?
这是有效的截图:
Button(
action: { },
label: { Text("Start") }
).buttonStyle(PlainButtonStyle())
Run Code Online (Sandbox Code Playgroud)
这是一个没有的:
Button(
action: { },
label: { Text("Start") }
).buttonStyle(RoundedButtonStyle())
Run Code Online (Sandbox Code Playgroud)
其中 RoundedButtonStyle() 定义为:
struct RoundedButtonStyle: ButtonStyle {
func makeBody(configuration: Configuration) -> some View {
configuration.label
.padding(6)
.foregroundColor(Color.white)
.background(Color.blue)
.cornerRadius(100)
}
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 URLSession.DataTaskPublisher 为我的 API 编写一些单元测试。我在 Stackoverflow 上发现了一个已经存在的问题,但我正在努力使用建议的解决方案来实现一个工作班级。
这是现有的问题:如何模拟 URLSession.DataTaskPublisher
protocol APIDataTaskPublisher {
func dataTaskPublisher(for request: URLRequest) -> URLSession.DataTaskPublisher
}
class APISessionDataTaskPublisher: APIDataTaskPublisher {
func dataTaskPublisher(for request: URLRequest) -> URLSession.DataTaskPublisher {
return session.dataTaskPublisher(for: request)
}
var session: URLSession
init(session: URLSession = URLSession.shared) {
self.session = session
}
}
class URLSessionMock: APIDataTaskPublisher {
func dataTaskPublisher(for request: URLRequest) -> URLSession.DataTaskPublisher {
// How can I return a mocked URLSession.DataTaskPublisher here?
}
}
Run Code Online (Sandbox Code Playgroud)
我的 API 然后像这样使用上面的:
class MyAPI {
/// Shared URL session …
Run Code Online (Sandbox Code Playgroud) 我不明白 navigationBarTitle() 和 navigationTitle() 之间的确切区别。有人可以解释一下什么时候使用哪个吗?