我在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) 我想对 Swift 中的方法调度有一个深入的了解。我从这个流行的博客中读到了以下三种类型的调度:
在那篇博客中,作者说 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:) …
我已阅读 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 …
我阅读了这个关于字符串编码的非常重要的博客。
阅读后我意识到 unicode 是将字符映射到整数代码点的标准。这些整数如何存储在内存中是一个完全不同的概念。这就是.utf8
,.utf16
发挥作用的地方,定义了我们在内存中存储这些整数的方式。
在 Swift String
API 中有一种方法可以为我们提供用于表示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 没有提供我如何存储它的细节。
谁能告诉我我在这里错过了什么?我现在真的很困惑。
要将 navigationBarItem 添加到 SwiftUI 视图,我们可以使用类似于以下的代码:
NavigationView {
Text("SwiftUI")
.navigationBarTitle("Welcome")
.navigationBarItems(trailing: Button("Help") {
print("Help tapped!")
}
)
}
Run Code Online (Sandbox Code Playgroud)
如何有条件地做到这一点。假设数组为空,则显示“帮助”栏按钮,否则不显示栏按钮。
swift ×5
ios ×2
dispatch ×1
javascript ×1
nsfilehandle ×1
png ×1
reactjs ×1
swift-string ×1
swiftui ×1
unicode ×1
wkwebview ×1