在我的 SwiftUI 应用程序中,每次值更改时我都需要从 ObservedObject 获取数据。我知道我们可以用 .onReceive 做到这一点?我不太了解 Apple 的文档。我不知道我怎么能做到这一点。
我的代码:
import SwiftUI
import CoreLocation
struct Compass: View {
@StateObject var location = LocationManager()
@State private var angle: CGFloat = 0
var body: some View {
VStack {
Image("arrow")
.resizable()
.aspectRatio(contentMode: .fit)
.frame(width: 300, height: 300)
.modifier(RotationEffect(angle: -CGFloat(self.angle.degreesToRadians)))
.onReceive(location, perform: {
withAnimation(.easeInOut(duration: 1.0)) {
self.angle = self.location.heading
}
})
Text(String(self.location.heading.degreesToRadians))
.font(.system(size: 20))
.fontWeight(.light)
.padding(.top, 15)
}
}
}
struct RotationEffect: GeometryEffect {
var angle: CGFloat
var animatableData: CGFloat {
get { …Run Code Online (Sandbox Code Playgroud) 通过 using 将 TabView 用作 pageviewer.tabViewStyle(PageTabViewStyle())工作正常,但试图通过应用让它从边缘运行到边缘edgesIgnoringSafeArea似乎不起作用。
我在这里缺少什么?
struct ContentView: View {
let colors: [Color] = [.red, .green, .blue]
var body: some View {
TabView {
ForEach(0...2, id: \.self) { index in
Rectangle()
.fill(colors[index])
}
}
.tabViewStyle(PageTabViewStyle())
.edgesIgnoringSafeArea(.all)
}
}
Run Code Online (Sandbox Code Playgroud)
将另一个添加 .edgesIgnoringSafeArea(.all)到RectangleorForEach也不起作用。
请注意,所有这些问题都不同,因为它们不使用 use PageTabViewStyle():
如果你在a中拖动UIViewController以开始a 中的交互式弹出过渡UINavigationController,UIViewController则当前的一个已经viewWillAppear:调用,然后是UINavigationControllerDelegate方法navigationController:willShowViewController:animated:
如果取消的过渡,既viewWillAppear:与viewDidAppear:预期得到所谓的顶视图控制器.
然而,无论是委托方法navigationController:willShowViewController:animated:或navigationController:didShowViewController:animated:调用的.
考虑到调用UIViewController视图生命周期方法,似乎至少应调用其中一个或两个.我想知道这是故意还是错误UIViewController.
我真正需要的是能够看到在我的UINavigationController子类或其中取消交互式弹出的时间UINavigationController.有明显的方法吗?
编辑
我仍在寻找解决方案,但我想提一下,我已将此问题报告为Apple的错误.查看文档,没有理由不调用这些委托方法,特别是考虑到调用等效的视图生命周期方法.
EDIT2
我的雷达车票(16823313)今天(2015年5月21日)关闭并按预定标记.:(
Engineering已根据以下信息确定此问题的行为符合预期:
这实际上是正确的行为.从B - > A发生的导航转换,如果你在转换中取消它,你将不会得到didShowViewController:方法.取消这种转变不应被视为从A - > B过渡,因为你从未真正到过A.
view [Will/Did]出现仍应按预期调用.
这种情况相当糟糕,因为它是违反直觉的,但我的答案中的解决方法在可预见的未来应该可以正常工作,至少在我的用例中是这样.
我试图更好地理解容器视图在故事板中的工作原理.行为似乎是容器视图将强制其子视图调整大小以填充容器.

我没有看到解释它的约束,也没有提到它是什么类.这似乎是一些故事板的魔力.

我假设容器视图必须是一个子类UIView,我会猜测并假设它被调用UIContainerView,但搜索文档只会产生两个结果.

那么它是怎样工作的?
是否可以将 new.searchable与 结合使用@FetchRequest?
我有这样的代码:
struct FooListView: View {
@Environment(\.managedObjectContext) private var viewContext
@FetchRequest(
sortDescriptors: [NSSortDescriptor(keyPath: \Foo.name, ascending: true)],
animation: .default)
private var items: FetchedResults<Foo>
@State var searchText = ""
var body: some View {
NavigationView {
List {
ForEach(items) { item in
NavigationLink(destination: FooView(Foo: item)) {
Text(item.wrappedName)
}
}
.onDelete(perform: deleteItems)
}
.searchable(text: $searchText)
.navigationTitle("Foos")
}
}
}
Run Code Online (Sandbox Code Playgroud)
我想使用 来searchText过滤我的FetchedResults.
我遇到的问题是decimalFormatter不会触发和更新绑定,除非textField 触发提交事件,即点击返回。
因此,我正在寻找如何手动触发文本字段提交事件?
下面的格式化程序代码将采用任何数字,并确保它始终有一个小数位(IE -- 10.5),并且如果插入了字母字符,这也正是我想要的,还将输入恢复为以前的有效输入。
import SwiftUI
import Combine
struct StandardRegimen: View {
@State private var totalDose = 6000.0
private var decimalFormatter: NumberFormatter = {
let f = NumberFormatter()
f.isLenient = true
f.numberStyle = .none
f.maximumFractionDigits = 1
f.minimumFractionDigits = 1
f.alwaysShowsDecimalSeparator = true
return f
}()
var body: some View{
return
VStack(alignment:.center,spacing:10){
TextField("?", value:$totalDose, formatter: self.decimalFormatter, onCommit: {
print("COMMITED!");
}).font(.system(size: 25.0))
.textFieldStyle(RoundedBorderTextFieldStyle())
.keyboardType(.decimalPad)
}
}
Run Code Online (Sandbox Code Playgroud)
如果删除修饰符代码.keyboardType(.decimalPad)并按键盘上的返回键,它将触发COMMITED 消息并关闭键盘
但是, …
CKFetchNotificationChangesOperation返回INSERT操作,但UPDATE和DELETE并不总是如此.DELETE,UPDATE在我向App Store提交应用程序时最后工作,但现在不再了.为什么?我创建了以下订阅:
let s = CKSubscription(recordType: recordType, predicate: NSPredicate(value: true), options: .FiresOnRecordCreation | .FiresOnRecordUpdate | .FiresOnRecordDeletion)
s.notificationInfo = CKNotificationInfo()
subscriptionsToSave.append(s)
Run Code Online (Sandbox Code Playgroud)
仪表板显示所有树触发器:

我没有使用任何alertBody,所以通知是一个所谓的无声通知,它可能是原因吗?
在CloudKit提示和技巧讲师说,订阅需要从开发人员门户打开应用程序ID的APS功能.我不认为我有,但我只想要提取通知,只有在这有效时才推送.
背景能力? - 同样的
需要在app的信息plist中设置APS环境密钥. - 我想我拥有它.
我正在尝试在我的 osx 上运行 php-fpm:
php-fpm -t
Run Code Online (Sandbox Code Playgroud)
我收到这个错误:
[30-Dec-2017 13:36:12] ERROR: failed to open error_log (/usr/var/log/php-fpm.log): No such file or directory (2)
[30-Dec-2017 13:36:12] ERROR: failed to post process the configuration
[30-Dec-2017 13:36:12] ERROR: FPM initialization failed
Run Code Online (Sandbox Code Playgroud)
我没有那个文件也不能创建它 - 即使使用 sudo:
$:/usr $ sudo mkdir var
Password:
mkdir: var: Operation not permitted
Run Code Online (Sandbox Code Playgroud)
所以我的下一个大动作是在php-fpm配置中找到这个日志文件目录设置的确切位置(以便我可以决定日志文件应该去哪里)..似乎有很多配置文件,所以我参考了这个问题在找到我的 php-fpm 配置文件的位置。所以在我的php -i文件的输出中,我有这个:
'--sysconfdir=/usr/local/etc/php/7.1'
Run Code Online (Sandbox Code Playgroud)
我有以下文件:
// can't be coming from this file
// b/c this is telling me it's /usr/local/var/log/php-fpm.log
; …Run Code Online (Sandbox Code Playgroud) 我正在尝试通过以下代码使用 @Observable 和 @Environment 来使用新的 Swift 宏:
import SwiftUI
import Observation
@Observable class Note {
var text = ""
}
struct ContentView: View {
@State var note = Note()
var body: some View {
FormView()
.environment(note)
}
}
struct FormView: View {
@Environment(Note.self) var note
var body: some View {
Form {
TextField("write here", text: $note.text)
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是,无法构建并出现以下错误:
Cannot find '$note' in scope
删除$in 的$note结果是:
Cannot convert value of type 'String' to expected argument …
struct ContentView: View {
@State private var selectedIdx = 0
var body: some View {
TabView(selection: $selectedIdx) {
ForEach(0..<5) { idx in
Text("\(idx)")
}
}
.tabViewStyle(PageTabViewStyle(indexDisplayMode: .never))
}
}
Run Code Online (Sandbox Code Playgroud)
环境:Xcode 12.2 iOS 14.2
当我在页面之间滑动时,SwiftUI 内存中的 TabView 不断增加。运行仪器,我没有看到任何泄漏,但分配和持久内存不断增加。
理想情况下,即使每次都重新创建页面,5 个页面消耗的总内存(如上面的代码)也不应该改变。
这是 SwiftUI 中的错误吗?或者我错过了什么?
swiftui ×6
ios ×5
swift ×3
ios14 ×2
objective-c ×2
uikit ×2
cloudkit ×1
combine ×1
fetchrequest ×1
fpm ×1
homebrew ×1
macos ×1
php ×1
searchable ×1
swift-macro ×1
swift5 ×1
xcode ×1