这是我之前的asyncDetached 在 MainActor call 之后回到主线程的后续。
这是 iOS 视图控制器的完整代码:
import UIKit
func test1() {
print("test1", Thread.isMainThread) // true
Task {
print("test1 task", Thread.isMainThread) // false
}
}
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
test1()
test2()
}
func test2() {
print("test2", Thread.isMainThread) // true
Task {
print("test2 task", Thread.isMainThread) // true
}
}
}
Run Code Online (Sandbox Code Playgroud)
这两个函数test1和test2是相同的,并且是从同一位置调用的。然而,其中一个operation:在后台线程上运行其任务初始值设定项函数,另一个在主线程上运行。
是什么决定了这一点?我只能认为这与声明方法的位置有关。但这与声明方法的位置有什么关系呢?
重新标记 git 提交后,我无法再获取该包,因为 SP 管理器使用了一些我无法找到和清理的缓存。出现错误:
基础 RemoteSourceControl https://github.com/myUser/myRepo版本 1.0.0 的修订版 30c16cab9c718416fee2191ff2ac0b6f91eeb511 与之前记录的值不匹配
我清理了所有我知道的地方:本地 .build 文件夹、Home 和 Library/Caches 文件夹中的 SPM 缓存、DerivedData、删除了 Package.resolved。
使用 Swift 5.7,尝试通过swift package generate-xcodeproj. 有谁知道这个缓存在哪里吗?
我的iOS项目一直面临以下问题(这只是警告)。
“ Hashable.hashValue”已作为协议要求弃用;通过实现'hash(into :)'来使类型'ActiveType'与'Hashable'一致
源代码:
public enum ActiveType {
case mention
case hashtag
case url
case custom(pattern: String)
var pattern: String {
switch self {
case .mention: return RegexParser.mentionPattern
case .hashtag: return RegexParser.hashtagPattern
case .url: return RegexParser.urlPattern
case .custom(let regex): return regex
}
}
}
extension ActiveType: Hashable, Equatable {
public var hashValue: Int {
switch self {
case .mention: return -1
case .hashtag: return -2
case .url: return -3
case .custom(let regex): return regex.hashValue
}
} …Run Code Online (Sandbox Code Playgroud) 在 info.plist 文件中,我配置URL Identifier并URL Scheme成功。我也可以使用自定义 URL 打开应用程序。问题是当应用程序第一次启动该方法时
func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>)
Run Code Online (Sandbox Code Playgroud)
不叫。
我有一些基于上述方法的依赖功能。所以当应用程序第一次启动时,我在我的应用程序中看不到任何东西。
我还在方法中添加了代码
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
guard let _ = (scene as? UIWindowScene) else { return }
let url = connectionOptions.urlContexts.first?.url
}
Run Code Online (Sandbox Code Playgroud)
但我在这里得到的 url 为零。
但是,如果我的应用程序处于后台模式并且我点击了 URL,那么上述方法调用成功并且相关功能正常工作。以下是我scene(_:openURLContexts:)在sceneDelegate.
func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>){
let url = URLContexts.first?.url
let urlString: String = url!.absoluteString
if let urlComponents = URLComponents(string: urlString),let queryItems …Run Code Online (Sandbox Code Playgroud) 我使用以下代码片段(在Xcode 13 Beta 5部署目标设置为 14.0 中)根据 iOS 版本有条件地应用视图修饰符:
struct ContentView: View {
var body: some View {
Text("Hello, world!")
.modifyFor(iOS14: {
$0.onAppear {
//do some stuff
}
}, iOS15: {
$0.task { //<---- Error: 'task(priority:_:)' is only available in iOS 15.0 or newer
//do some stuff
}
})
}
}
struct CompatibleView<Input: View,
Output14: View,
Output15: View>: View {
var content: Input
var iOS14modifier: ((Input) -> Output14)?
var iOS15modifier: ((Input) -> Output15)?
@ViewBuilder var body: some View { …Run Code Online (Sandbox Code Playgroud) 我有一段简单的代码:
struct ContentView: View {
var body: some View {
Text("Hello world!")
.task {
await myAsyncFunc()
}
}
private func myAsyncFunc() async {}
}
Run Code Online (Sandbox Code Playgroud)
这编译完全没问题。但是,如果我用以下内容替换任务:
.task(myAsyncFunc)
Run Code Online (Sandbox Code Playgroud)
它不起作用,并给我以下错误:
将不可发送的函数值转换为“@Sendable () async -> Void”可能会引入数据争用
这是为什么?我该如何解决它?
我正在使用 swiftUI 进行编码,并且我有一个垂直的scrollView(参见屏幕截图),在其中scrollView我有另一个水平的scrollView,在其下面我有一个VStack我希望高度将屏幕的其余部分填充到垂直的底部scrollView,但我似乎无法让它发挥作用。
在某些情况下,垂直方向的内容scrollView可能大于实际剩余空间,这就是为什么我需要滚动视图,但在其他一些情况下,内容小于剩余空间
这是我的代码:
VStack {
HeaderView
ScrollView(.vertical, showsIndicators: false) {
FriendsHorizontalScrollView()
VStack {
// I want this view to take all the remaining height left in the scrollView
FullHeightView()
}
.frame(width: UIScreen.main.bounds.width)
}
}
Run Code Online (Sandbox Code Playgroud)
我最终得到的是这样的:
我想要拥有什么:
我尝试了几种解决方案,例如使用 GeometryReader 或安装.frame(maxHeight: .infinity),VStack但似乎都无法正常工作。
编辑:正如sunshinejr在这里指出的,此问题已修复,将与下一个Xcode / Swift版本一起发布。
在使用Swift 4和Swift 5代码库将Xcode 10.1更新为Xcode 10.2之后,我已经看到很多奇怪的行为。
问题之一是在一个ViewController上不再调用ScrollView委托方法。简化的视图层次结构如下:
| ScrollView (ParentScrollView)
| -- Stack View
| ---- ScrollView (ChildScrollView)
| ---- ScrollView (ChildScrollView)
| ---- ScrollView (ChildScrollView)
Run Code Online (Sandbox Code Playgroud)
它充当具有多个页面的视图:ParentScrollView可以水平滚动,ChildScrollView垂直滚动。
ViewController是所有Scrollview(在Storyboard中设置)的委托,但是scrollViewDidEndDecelerating在滚动任何视图(ParentScrollView或ChildScrollView)时不会调用委托方法(如)。该基类的ViewController符合UIScrollViewDelegate。
我试过在代码中设置委托,除了不知道自己可能做错了什么。该转换未更改该类中的任何代码,但是在更新之前一切正常。在Swift 5发行说明中,我也通常找不到手势,委托或ScrollView的任何更改。
Swift 5编译器似乎是一个错误。此外,有时它确实起作用,有时却不起作用-所有这些都无需更改任何代码或项目设置。
为什么这不再起作用?有没有其他人经历过类似的行为?
我们有一个iOS项目。Swift语言版本为4.2。我们以前是在Xcode 10.1中构建它的,没有编译错误。
更新到Xcode 10.2(但保留Swift 4.2)之后,该项目现在充满了诸如Invalid redeclaration of 'variable.storage'(其中variable的某些变量的名称)之类的错误。这些错误出现在私有的,用惰性方式初始化的变量旁边,这些变量的名称在整个项目中都是常用的,但不在其范围内重新声明;该错误似乎与storage消息的一部分有关。清理并重建不能解决问题。有什么建议么?
编辑:这些错误只出现在两个类中。由于所有这些重新声明错误,我还错过了另一个合法的编译错误(Xcode 10.2中的新功能,但足够合法)。经过一番混乱**之后,我发现错误消失了。似乎是编译器中的错误。
**我的混乱步骤是(1)取消嵌套我遇到这些错误的第一个类,(2)创建一个与未编译的类具有相同内容的新类,并指向该类,(3)注释掉失败的类,(4)找到并修复了合法的编译错误。在这一点上,我不需要弄乱另一个也给出了重新声明错误的类。现在已编译代码。因此,(5)恢复了第一类。因此,这些重新声明错误可能只是误导了;如果您找到并修复了所有与迁移相关的错误,希望您不会看到其中任何一个。