我正在使用 Apple 实现登录,基本上一切正常,我不需要帮助。但是,在测试我的实现时,我想重置回我第一次使用 Apple 登录之前,它会询问您是否要创建一个帐户,并询问您的姓名和电子邮件地址。像这样:
在您第一次登录然后再次登录后,它只会询问您是否要使用您的 Apple ID 登录,但会跳过requestedScopes. 那么,我怎样才能回到它要求提供requestedScopes信息(例如姓名和电子邮件)的第一个状态?
重新安装应用程序没有帮助。
我有一个使用 Firebase 的 Firestore 和 Auth 的项目。当我创建 SwiftUI 视图时,预览画布不起作用。我收到以下错误。
Compiling failed: linker command failed with exit code 1 (use -v to see invocation)
failedToBuildDylib: ld: warning: directory not found for option '-F/Applications/Xcode.app/Contents/SharedFrameworks-iphonesimulator'
Undefined symbols for architecture x86_64:
"___asan_alloca_poison", referenced from:
+[GDTFLLUploader gzippedData:] in GoogleDataTransportCCTSupport(GDTFLLUploader.o)
"___asan_allocas_unpoison", referenced from:
+[GDTFLLUploader gzippedData:] in GoogleDataTransportCCTSupport(GDTFLLUploader.o)
"___asan_handle_no_return", referenced from:
-[FIRAuthCredential init] in FirebaseAuth(FIRAuthCredential.o)
-[FIRAuthCredential prepareVerifyAssertionRequest:] in FirebaseAuth(FIRAuthCredential.o)
-[FIREmailAuthProvider init] in FirebaseAuth(FIREmailAuthProvider.o)
-[FIRCollectionReference initWithQuery:] in FirebaseFirestore(FIRCollectionReference.o)
Run Code Online (Sandbox Code Playgroud)
即使在最基本的“Hello World”视图中也会发生这种情况,我不导入与 Firebase 相关的任何内容。
我可以对此做些什么,或者我可以在整个项目中不使用预览画布吗?
以最基本的示例应用程序为例,其中有两个屏幕NavigationView:
import SwiftUI
struct ContentView: View {
var body: some View {
NavigationView {
List {
NavigationLink(destination: SubView()) {
Text("Go to screen 2")
}
}
.navigationBarTitle("Screen 1", displayMode: .inline)
}
}
}
struct SubView: View {
var body: some View {
Text("Hello, World!")
.navigationBarTitle("Screen 2", displayMode: .inline)
}
}
Run Code Online (Sandbox Code Playgroud)
如果您转到屏幕 2 并按后退按钮返回屏幕 1,SubView则永远不会释放。如果你来回多次,就会有多个SubView活着的实例。这感觉像是一个巨大的问题/内存泄漏,默认情况下它的行为看起来很奇怪。有解决方法吗?
在尝试使用Combine 分配值时,我看到了一些我不太理解的结构与类行为。
代码:
import Foundation
import Combine
struct Passengers {
var women = 0
var men = 0
}
class Controller {
@Published var passengers = Passengers()
var cancellables = Set<AnyCancellable>()
let minusButtonTapPublisher: AnyPublisher<Void, Never>
init() {
// Of course the real code has a real publisher for button taps :)
minusButtonTapPublisher = Empty<Void, Never>().eraseToAnyPublisher()
// Works fine:
minusButtonTapPublisher
.map { self.passengers.women - 1 }
.sink { [weak self] value in
self?.passengers.women = value
}.store(in: &cancellables)
// Doesn't work:
minusButtonTapPublisher …Run Code Online (Sandbox Code Playgroud) 我正在使用 SwiftUI,目前正在使用 Picker 构建表单。
import SwiftUI
struct ContentView: View {
private let names = ["Bill", "Peter", "Johan", "Kevin"]
@State private var favoritePerson = "Bill"
var body: some View {
NavigationView {
Form {
Picker("Favorite person", selection: $favoritePerson) {
ForEach(names, id: \.self) { name in
Text(name)
}
}
}
.navigationBarTitle("Form", displayMode: .inline)
}
}
}
Run Code Online (Sandbox Code Playgroud)
第一次点击“最喜欢的人”行时,选择器显示正常,点击其中一个名字会将您带回表单。但是第二次点击表单行不会做任何事情:您没有转到选择器,该行保持突出显示但没有任何反应。如果这是 SwiftUI 错误,是否有已知的解决方法?(我已经需要使用一个小的导航栏标题来解决 Picker UI 错误,否则它的内容在显示时会向上移动??)
我有一个非常简单的UICollectionView,使用 iOS 13 的UICollectionViewCompositionalLayout. 单元格有一个垂直的UIStackView,当您按下“切换详细信息”按钮时,我只需更改isHidden的值detailsView。当单元格通知视图控制器它需要执行时collectionView.collectionViewLayout.invalidateLayout(),一切基本上都正常:详细信息视图会打开和关闭。但它并没有动画化,所以看起来有点刺耳。
class ViewController: UIViewController {
@IBOutlet private var collectionView: UICollectionView!
override func viewDidLoad() {
super.viewDidLoad()
collectionView.collectionViewLayout = createLayout()
}
private func createLayout() -> UICollectionViewLayout {
let itemSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1), heightDimension: .estimated(200))
let item = NSCollectionLayoutItem(layoutSize: itemSize)
let groupSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1), heightDimension: .estimated(200))
let group = NSCollectionLayoutGroup.horizontal(layoutSize: groupSize, subitems: [item])
let section = NSCollectionLayoutSection(group: group)
section.contentInsets = .init(top: 16, leading: 16, bottom: 16, …Run Code Online (Sandbox Code Playgroud) 我正在考虑向我的网络应用程序添加对 WebAuthn / 密钥的支持,但事实上,您需要单独的注册和登录流程,并且仍然需要用户名,这对我来说几乎是不可能的。我真的想知道我是否在这里遗漏了一些东西,或者是否可以以某种方式使其对用户不可见。
例如,我目前提供通过电子邮件登录:用户只需输入他们的电子邮件地址,然后就会收到登录链接。无论他们是否是现有用户;如果是新的电子邮件地址,我可以简单地创建一个新帐户。对于用户来说,这是完全不可见的,他们不必在“注册”和“登录”按钮之间进行选择,他们不必尝试记住他们是否已经拥有帐户。只需输入您的电子邮件地址即可。
我还提供“使用 Apple 登录”,其流程相同:我在 Apple 的令牌中获取唯一的 Apple 用户 ID(主题),检查数据库中是否有具有此 ID 的用户,然后登录该用户。如果没有,我创建一个新用户,存储该 ID,然后登录。用户再也不必在“注册”和“登录”之间进行选择,他们根本不需要输入任何个人信息。
但使用 WebAuthn,您必须使用用户名创建或获取凭据。因此,我必须在网站上显示用户名输入字段,将其发送到服务器,服务器检查该用户是否存在,并基于该用户可以创建或获取凭据。但用户名很糟糕,一旦你有足够的用户,每个人都必须选择一个唯一的用户名,这总是令人沮丧的。因此,我可以要求提供电子邮件地址,但我想存储尽可能少的个人身份信息(是的,我提供通过电子邮件登录的方法,但这就是为什么我想提供 WebAuthn 作为替代选项)。
那么,如何简化这一过程呢?有没有办法绕过用户名要求,浏览器只需询问身份验证器是否有该网站的公钥,如果没有,则创建它。这样我就可以在网站上提供一个“使用密码登录”按钮,而无需询问用户名(或电子邮件地址)。
如果您想将 传递@EnvironmentObject给以工作表形式呈现的视图,您会注意到每次更新@Published其中的任何属性时都会重新创建该工作表。@EnvironmentObject
演示该问题的最小示例:
import SwiftUI
class Store: ObservableObject {
@Published var name = "Kevin"
@Published var age = 38
}
struct ContentView: View {
@EnvironmentObject private var store: Store
@State private var showProfile = false
var body: some View {
VStack {
Text("Hello, \(store.name), you're \(store.age) years old")
Button("Edit profile") {
self.showProfile = true
}
}
.sheet(isPresented: $showProfile) {
ProfileView()
.environmentObject(self.store)
}
}
}
struct ProfileView: View {
@EnvironmentObject private var store: Store
@ObservedObject private …Run Code Online (Sandbox Code Playgroud) 我希望匹配以@开头的所有字符串,除非它们在@前面还有其他字符.简单的例子:在@one @two and bla@three我想匹配@one和@two,但不会 @three.这是为了突出聊天室中的用户名.
这些字符串可以在句子中的任何位置(在开头或中间).
我实际上认为(?![a-zA-Z])@[a-zA-Z]+应该工作,但它仍然匹配@three.
我正在通过 UIViewRepresentable 为 SwiftUI 构建自定义 UITextView。它旨在显示NSAttributedString和处理链接按下。一切正常,但是当我在NavigationView带有内联标题的 a 中显示此视图时,框架高度完全混乱。
import SwiftUI
struct AttributedText: UIViewRepresentable {
class Coordinator: NSObject, UITextViewDelegate {
var parent: AttributedText
init(_ view: AttributedText) {
parent = view
}
func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange, interaction: UITextItemInteraction) -> Bool {
parent.linkPressed(URL)
return false
}
}
let content: NSAttributedString
@Binding var height: CGFloat
var linkPressed: (URL) -> Void
public func makeUIView(context: Context) -> UITextView {
let textView = UITextView()
textView.backgroundColor = .clear …Run Code Online (Sandbox Code Playgroud) swiftui ×5
ios ×4
combine ×1
instruments ×1
javascript ×1
regex ×1
swift ×1
swiftui-form ×1
webauthn ×1
xcode ×1