小编Anj*_*hah的帖子

结合@Published 属性:在更新期间从别处获取当前值

我的主要问题是我正在尝试解决(未记录的)事实,即@Published在订阅者收到更改通知后,属性不会更新属性的值。我似乎无法找到解决它的好方法。

考虑以下 aSubject@Published属性的人为组合。首先是一个简单的类:

class StringPager {
    @Published var page = 1
    @Published var string = ""
}
let pager = StringPager()
Run Code Online (Sandbox Code Playgroud)

然后是一个简单的传递主题:

let stringSubject = PassthroughSubject<String, Never>()
Run Code Online (Sandbox Code Playgroud)

为了调试,让我们订阅字符串属性并打印出来:

pager.$string.sink { print($0) }
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好。接下来,让我们订阅主题并根据其值更改寻呼机:

stringSubject.sink { string in
  if pager.page == 1 {
    pager.string = string
  } else {
    pager.string = string.uppercased()
  }
}
Run Code Online (Sandbox Code Playgroud)

希望这个逻辑可以让我们在不在第一页时将寻呼机字符串设为大写。

现在让我们在页面更新时通过 stringSubject 发送值:

pager.$page.sink { 
  $0 == 1 ? stringSubject.send("lowercase") : stringSubject.send("uppercase") 
}
Run Code Online (Sandbox Code Playgroud)

如果我们正确地理解了这个逻辑,那么小写将始终为小写,而大写将始终为大写。不幸的是,事实并非如此。这是一个示例输出:

pager.page = 1 // lowercase
pager.page …
Run Code Online (Sandbox Code Playgroud)

ios swift combine

14
推荐指数
2
解决办法
6940
查看次数

UIDocumentPickerViewController in SwiftUI on mac (macCatalyst)

所以我一直在干预将一个小型 SwiftUI iPad 应用程序“移动”到 Mac,并且我在使用UIDocumentPickerViewController. 我已经包裹UIDocumentPickerViewController在一个UIViewControllerRepresentable像这样:

struct DocumentPickerView: UIViewControllerRepresentable {
  func makeUIViewController(context: Context) -> UIDocumentPickerViewController {
    let documentPicker = UIDocumentPickerViewController(documentTypes: [(kUTTypeImage as String)], in: .import)
    return documentPicker
  }

  func updateUIViewController(_ uiViewController: UIDocumentPickerViewController, context: Context) {

  }
}
Run Code Online (Sandbox Code Playgroud)

并像这样显示它:

struct ContentView: View {
@State var shows = false
var body: some View {
    Button(action: { self.shows.toggle() }) {
        Text("Select File")
    }
    .sheet(isPresented: self.$shows) {
        DocumentPickerView()
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

在 iPad 上一切正常, iPad

但是当在 Mac 上时,UIDocumentPickerViewController …

macos ios swift swiftui mac-catalyst

11
推荐指数
1
解决办法
2764
查看次数

如何通过 SwiftUI 按钮在 UIViewController 中执行函数?

在下面的代码中,我试图弄清楚如何savePhoto使用SwiftUI按钮执行该功能。这实际上是我试图解决的问题的简化版本,但仍然无法弄清楚。我在 中创建的按钮ContentView是我想象中解决问题的方式,但由于 SwiftUI 结构,我似乎无法找到解决方法。

这是我的 SwiftUI 视图:

struct ContentView: View {
    var body: some View {
        ZStack{
            AnotherControllerView()
            Button(action: { AnotherControllerView.savePhoto() }){
                Text("Save Photo")
            }
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

Run Code Online (Sandbox Code Playgroud)

还有我集成的 UIViewController:

import Foundation
import SwiftUI
import UIKit

struct AnotherControllerView : UIViewControllerRepresentable {

    typealias UIViewControllerType = AnotherController

    func makeCoordinator() -> AnotherControllerView.Coordinator {
        Coordinator(self)
    }

    func makeUIViewController(context: UIViewControllerRepresentableContext<AnotherControllerView>) -> AnotherController {

        return AnotherController() …
Run Code Online (Sandbox Code Playgroud)

ios swift swiftui

9
推荐指数
1
解决办法
3190
查看次数

表单和列表的 SwiftUI 内存泄漏

我正在开发简单的待办事项应用程序SwiftUI。在我的测试中,我注意到我的视图模型从不调用 deinit 并导致内存使用量线性增加。

我使用以下代码重现了相同的行为:

struct ContentView: View {
    @State private var isPresented = false

    var body: some View {
        Button("open") {
            self.isPresented = true
        }
        .sheet(isPresented: $isPresented) {
            SheetView()
        }
    }
}

struct SheetView: View {
    @ObservedObject var model: ViewModel

    init() {
        model = ViewModel()
    }

    var body: some View {
        Form {
            Toggle("Toggle Me", isOn: $model.isOn)
        }
    }
}

class ViewModel: ObservableObject {
    @Published var isOn = false

    deinit {
        print("ViewModel deinit ")
    }
}
Run Code Online (Sandbox Code Playgroud)

当工作表被解除时,模型对象永远不会取消。如果我用 VStack …

memory-leaks ios swiftui

9
推荐指数
1
解决办法
1051
查看次数

Html 视频背景不适用于 Ionic 框架上的 iOS

我正在尝试为我的Ionic应用程序获取全屏视频背景,它在 Android 和浏览器上运行良好,但是当我在 Xcode 模拟器中的 iPhone 上运行该应用程序时,它只是一个白色背景,视频无法加载.

html代码:

 <div class="fullscreen-bg">
    <video autoplay loop muted playsinline webkit-playsinline>
      <source src="/assets/videos/background.mp4" type="video/mp4">
    </video>
 </div>
Run Code Online (Sandbox Code Playgroud)

CSS 代码:

.fullscreen-bg {
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  overflow: hidden;
  z-index: -100;
  height: 100vh;
}
Run Code Online (Sandbox Code Playgroud)

我还在 config.xml 文件中添加了这个

<preference name="AllowInlineMediaPlayback" value="true"/>
Run Code Online (Sandbox Code Playgroud)

我错过了什么吗?

html css ios cordova ionic-framework

8
推荐指数
1
解决办法
1113
查看次数

当需要 iCloud 时如何处理首次启动体验?

我用来CloudKit存储公开可用的数据,并将新数据NSPersistentCloudKitContainer作为我的核心数据堆栈的一部分来存储/同步私有数据。

当用户打开我的应用程序时,他们处于以下 4 种状态之一:

  1. 他们是有权访问 iCloud 的新用户
  2. 他们是可以访问 iCloud 的回访用户
  3. 他们是新用户,但由于某种原因无法访问 iCloud
  4. 他们是回访用户,但由于某种原因无法访问 iCloud

状态 1 和状态 2 代表我的快乐路径。如果他们是新用户,我想在显示初始视图之前向用户的私人存储添加一些数据。如果他们是回头客,我想从核心数据中获取数据以传递到初始视图。

确定新/老用户: 我的计划是使用NSUbiquitousKeyValueStore. 我对此的担忧是处理以下情况: 下载应用程序 -> 被记录为之前启动过该应用程序 -> 删除并在新设备上重新安装/安装该应用程序 我认为NSUbiquitousKeyValueStore需要一些时间才能接收更新,因此我需要等待其完成同步,然后再进入初始视图。那么问题来了,如果他们无法访问 iCloud 会发生什么?NSUbiquitousKeyValueStore如果无法收到更新,如何告诉我他们是否是回访用户?

确定 iCloud 访问: 根据我所做的研究,我可以检查iCloudFileManager.default.ubiquityIdentityToken是否nil可用,但这不会告诉我原因。我必须用它CKContainer.default().accountStatus来了解为什么 iCloud 不可用。问题是这是一个异步调用,我的应用程序在了解他们的帐户状态是什么之前就会继续前进。

我对这个实在是摸不着头脑。优雅地确保所有这些状态都得到处理的最佳方法是什么?

core-data ios nsubiquitouskeyvaluestore cloudkit nspersistentcloudkitcontainer

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

如何在 SwiftUI 上使用 CAEmitterLayer 制作动画?

如何将此代码转换为SwiftUI. 这是雪花效应。我使用了 CAEmitterLayer 但我不知道如何在 SwfitUI 中使用它。SwiftUI 中没有 addSublayer。是否可以在不使用 UIHostingController 的情况下运行此代码?

let size = CGSize(width: 824.0, height: 1112.0)
let host = UIView(frame: CGRect(x: 0.0, y: 0.0, width: size.width, height: size.height))
self.view.addSubview(host)

let particlesLayer = CAEmitterLayer()
particlesLayer.frame = CGRect(x: 0.0, y: 0.0, width: size.width, height: size.height)

host.layer.addSublayer(particlesLayer)
host.layer.masksToBounds = true

particlesLayer.backgroundColor = UIColor(red: 0.0/255.0, green: 0.0/255.0, blue: 0.0/255.0, alpha: 1.0).cgColor
particlesLayer.emitterShape = .circle
particlesLayer.emitterPosition = CGPoint(x: 509.4, y: 707.7)
particlesLayer.emitterSize = CGSize(width: 1648.0, height: 1112.0)
particlesLayer.emitterMode = .surface
particlesLayer.renderMode …
Run Code Online (Sandbox Code Playgroud)

xcode ios caemitterlayer swiftui

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

未定义符号:___darwin_check_fd_set_overflow

当我尝试运行我的项目时出现此错误。

Undefined symbol: ___darwin_check_fd_set_overflow 
Run Code Online (Sandbox Code Playgroud)

在这里,我包含了pod 'mobile-ffmpeg-full', '4.3.2'这个用于视频流的框架。

完全错误:

Undefined symbols for architecture arm64:
  "___darwin_check_fd_set_overflow", referenced from:
      _read_key in mobileffmpeg(libmobileffmpeg_la-fftools_ffmpeg.o)
      _xmlNanoFTPCheckResponse in libxml2(nanoftp.o)
      _xmlNanoFTPCloseConnection in libxml2(nanoftp.o)
      _xmlNanoFTPList in libxml2(nanoftp.o)
      _xmlNanoFTPGet in libxml2(nanoftp.o)
      _OUTLINED_FUNCTION_8 in libxml2(nanoftp.o)
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

框架 Git 链接: https : //github.com/tanersener/mobile-ffmpeg

xcode cocoa-touch ffmpeg objective-c ios

4
推荐指数
1
解决办法
9333
查看次数

具有基本身份验证的 WKWebView

我正在尝试创建一个简单的应用程序WebView,其中嵌入了使用的网站,一切正常,除了我不明白如何对需要凭据的网站进行身份验证。我在网上搜索了几个小时,最终放弃寻找答案。可能只是我不知道该用什么措辞。希望这里的任何人都知道一种对凭据进行硬编码的方法,或者最好是一种让用户输入自己的凭据的方法。

谢谢你!

我使用的代码是最简单的,如下所示:

import SwiftUI
import WebKit

struct ContentView: View {
    var body: some View {
        NavigationView {
            VStack {
                WebView(request: URLRequest(url: URL(string: "https://siteurl")!))
            }.navigationBarTitle("Example Text")
        }
    }
}

struct WebView: UIViewRepresentable {
    let request: URLRequest

    func makeUIView(context: Context) -> WKWebView {
        return WKWebView()
    }

    func updateUIView(_ uiView: WKWebView, context: Context) {
        uiView.load(request)
    }
}
Run Code Online (Sandbox Code Playgroud)

authentication ios wkwebview swift5 xcode11

3
推荐指数
1
解决办法
3694
查看次数

UIWindowSceneSessionRoleApplication 的 Info.plist 配置“(无名称)”

我收到以下警告,应用程序显示黑屏 iOS 13

UIWindowSceneSessionRoleApplication 的[SceneConfiguration]Info.plist配置“(无名称)”包含 UISceneDelegateClassName 键,但无法加载名为MyApp.SceneDelegate 的类。

我该如何解决这个问题?

xcode ios ios13

2
推荐指数
2
解决办法
2545
查看次数

在 Nativescript 应用程序中修改 Podfile

我已在我的Nativescript应用程序中添加了一个共享扩展,该扩展需要一个 Pod。

因此,我需要修改 Nativescript 应用程序的 Podfile,以使用所需的 Pod 来定位我的共享扩展,如下所示:

target :MyApp do
    platform :ios, '8.0'
    use_frameworks!

    pod 'AFNetworking', '~> 2.0'
    pod '...'
end

target :MyExtension do
    use_frameworks!

    pod 'AFNetworking', '~> 2.0'
end

post_install do |installer_representation|
    installer_representation.pods_project.targets.each do |target|
        if target.name.start_with? "Pods-MyExtension"
            target.build_configurations.each do |config|
                config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= ['$(inherited)', 'AF_APP_EXTENSIONS=1']
            end
        end
    end
end
Run Code Online (Sandbox Code Playgroud)

这里的问题是,每次运行项目时,Podfile 都会被 Nativescript 覆盖。

那么,有一种方法可以“阻止”Podfile 以防止 Nativescript 覆盖它,或者可能有一个“钩子”用于在 Nativescript Podfile 生成后向 Podfile 添加自定义内容?

我该如何继续?

谢谢。

ios nativescript share-extension podfile

2
推荐指数
1
解决办法
1338
查看次数

澄清:如何在react-native中的我的应用程序中添加自定义包

react-native我根据我的要求更改了包 src 组件。我如何将其添加到我的应用程序中?

(即)我添加了react-native-floating-action并更改了文件中的一些FloatingActionItem.js样式FloatingAction.js。如何在我的应用程序中添加更改。

因为如果我删除节点模块,则再次安装后所有更改都会消失。

ios react-native

2
推荐指数
1
解决办法
2336
查看次数