小编Roh*_*ale的帖子

WKScriptMessageHandler不会在网页上的按钮元素上收听"onclick"或"click"事件.该网页使用Reactjs开发

我在UIViewController的视图中使用WKWebView来显示使用url端点托管在服务器上的网页.该网页使用Reactjs.这就是我对网页的所有信息.代码创建webview并将webview作为控制器视图的子视图插入.

let requestObj = URL(string:urlString)!
let preferences = WKPreferences()
preferences.javaScriptEnabled = true
let configuration = WKWebViewConfiguration()
configuration.preferences = preferences
webViewWK = WKWebView(frame: .zero, configuration: configuration)
webViewWK.navigationDelegate = self
_ = webViewWK.load(requestObj)
webViewwrapper = WKWebViewWrapper(forWebView: webViewWK)
Run Code Online (Sandbox Code Playgroud)

网页加载正常,控制器也充当webview的委托,并接收相同的消息.现在我还实现了一个符合WKScriptMessageHandler的WKWebViewWrapper类.然后,该类可以从webkit对象接收消息,该消息由WKWebView创建的场景创建.相同的实现如下

class WKWebViewWrapper : NSObject, WKScriptMessageHandler{

var wkWebView : WKWebView
let eventNames = ["buttonClick"]
var eventFunctions: Dictionary<String, (String) -> Void> = [:]
let controller: WKUserContentController

init(forWebView webView : WKWebView){
    wkWebView = webView
    controller = WKUserContentController()
    super.init()
}

func userContentController(_ userContentController: WKUserContentController, didReceive message: …
Run Code Online (Sandbox Code Playgroud)

javascript ios reactjs swift wkwebview

8
推荐指数
3
解决办法
1485
查看次数

应该使用谁的见证表?

我想对 Swift 中的方法调度有一个深入的了解。我从这个流行的博客中读到了以下三种类型的调度:

  1. 动态的
  2. 表(Swift 中的见证表)
  3. 信息

在那篇博客中,作者说 NSObject 子类型维护一个调度表(见证表)和一个消息调度层次结构。作者分享的代码片段如下:

class Person: NSObject {
    func sayHi() {
        print("Hello")
    }
}
func greetings(person: Person) {
    person.sayHi()
}

greetings(person: Person()) // prints 'Hello'

class MisunderstoodPerson: Person {}
extension MisunderstoodPerson {
    override func sayHi() {
        print("No one gets me.")
    }
}
greetings(person: MisunderstoodPerson()) // prints 'Hello'
Run Code Online (Sandbox Code Playgroud)

我将引用作者对 Person 实例调用 sayHi()的推理:

greetings(person:) 方法使用表调度来调用 sayHi()。这按预期解决,并打印“Hello”。这里没有什么太令人兴奋的了。现在,让我们继承 Person

作者继续解释了在 MisunderstoodPerson 类型转换为 Person 的实例上调用sayHi()

请注意, sayHi() 是在扩展中声明的,这意味着该方法将通过消息调度来调用。当调用 greetings(person:) …

dispatch swift

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

无法读取 PNG 文件的 IHDR 块

我已阅读 PNG 文件规范并了解到,在 PNG 签名的前 8 个字节之后,我们有 IHDR 块。该图像表明我们的 IHDR 长度为 13(0x0000000D) 字节。 在此输入图像描述

我已经用 swift 编写了一段代码来读取相同的 png 文件并打印字节,但该字节不会给我一个长度等于 PNG 签名后块的前 4 个字节的 13 个字节的 IHDR。控制台中代码的输出是

PNG Signature Bytes: 89 50 4E 47 0D 0A 1A 0A 
File offset: 8
IHDR length bytes: 00 00 00 04 
File offset: 12
IHDR Chunktype bytes: 43 67 42 49 
File offset: 16
IHDR Data byte: 50 00 20 02 
File offset: 20
pngImageWidth: 1342185474
pngImageWidth: 20480
pngImageHeight: 8194
Run Code Online (Sandbox Code Playgroud)

我是否在这里遗漏了某些内容或者我阅读的规范已过时?

前 8 个字节实际上是 PNG …

png nsfilehandle swift

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

为什么 unicode 作为编码包含在 Swift 的 String API 中?

我阅读了这个关于字符串编码的非常重要的博客

阅读后我意识到 unicode 是将字符映射到整数代码点的标准。这些整数如何存储在内存中是一个完全不同的概念。这就是.utf8,.utf16发挥作用的地方,定义了我们在内存中存储这些整数的方式。

在 Swift StringAPI 中有一种方法可以为我们提供用于表示String各种编码的数据字节:

func data(using encoding: String.Encoding, allowLossyConversion: Bool = false) -> Data?
Run Code Online (Sandbox Code Playgroud)

此方法的第一个参数是 Type String.Encoding。该结构Encoding的编码声明为:

static let unicode: String.Encoding
Run Code Online (Sandbox Code Playgroud)

现在突然该方法可以给我String使用编码的数据表示.unicode

现在这实际上与我在阅读上述博客后得出的结论相反。它给了我一个字符串的数据表示,甚至认为 unicode 没有提供我如何存储它的细节。

谁能告诉我我在这里错过了什么?我现在真的很困惑。

unicode character-encoding swift swift-string

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

如何有条件地将尾随导航栏项添加到将在 NavigationView 中显示的 SwiftUI 视图?

要将 navigationBarItem 添加到 SwiftUI 视图,我们可以使用类似于以下的代码:

NavigationView {
    Text("SwiftUI")
        .navigationBarTitle("Welcome")
        .navigationBarItems(trailing: Button("Help") {
                    print("Help tapped!")
           }
        )
    }
Run Code Online (Sandbox Code Playgroud)

如何有条件地做到这一点。假设数组为空,则显示“帮助”栏按钮,否则不显示栏按钮。

uibarbuttonitem ios swift swiftui ios-navigationview

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