月度归档: 2021 年 3 月

  • SwiftUI 遇到Simultaneous accesses to XXX, but modification requires exclusive access的解决办法

    本质上这个问题是一个系统bug,swiftUI中,如果你的List下不完全是依靠Foreach加载的core data的数据的话(即,你在list中添加了其他的View,例如自己写了个自定义的Title等),而你又提供了删除或者移动row的方法时,就会出现这种错误。

    这是由于swiftUI Foreach的onDelete的方法没有兼容上面所述的情况造成的

    目前可以使用的的解决办法是这样的:
    viewContext.perform {
                offsets.map { molts[$0] }.forEach(viewContext.delete)
    
                do {
                    try viewContext.save()
                } catch {
                    viewContext.rollback()
                    userMessage = "\(error): \(error.localizedDescription)"
                    displayMessage.toggle()
                }
    }
    在你的操作方法外,再套一层,调用viewContext.perform即可
  • 使用SSH来连接远程服务器的MySQL

    本文要解决什么问题:当远程服务器无法开放MySQL端口或者无权限操作远程服务器的安全组时,我们应该如何在本地连接到远程的MySQL并进行操作

    本文基础要求:远程服务器至少开放了SSH端口(通常默认情况下端口号为22),如果未开放22端口,则本文所述方法并不可用。

    本文方法总结:利用SSH自带的端口映射功能,建立一个tunnel,将远程服务器上的MySQL端口映射到本地的端口上,从而使得本地客户端可以直接连接

    关于如何使用SSH,以及如何更简单的使用SSH,可以参考另一篇文章

    当SSH已经准备就绪,打开Terminal,输入如下指令
    [code language=”shell”]

    ssh -L [local port]:[database host]:[remote port] [username]@[remote host]

    ssh -L [本地端口]:[数据库所在地址]:[数据库远程端口] [远程服务器用户名]@[远程服务器地址]
    [/code]
    *如果你不用同时登陆远程服务器进行操作,可以加上-N指令

    以上指令唯一需要解释的就是数据库所在地址,如果远程服务器本身就是MySQL服务器,那么可以直接填127.0.0.1, 而如果远程服务器本身还是一个跳板,则应该输入在远程服务器内可以访问到MySQL的地址。

    示例如下:
    [code language=”shell”]
    ssh -N -L 3310:127.0.0.1:3306 root@MyRemote
    [/code]
    以上的命令会将远程服务器监听3306端口的MySQL服务,映射到本地的3310端口上,之后可以直接使用MySQL客户端在命令行里登录,或者使用pma等数据库操作工具

    [code language=”shell”]
    mysql -u root -h 127.0.0.1 -P 3310 -p
    [/code]

  • SwiftUI CoreData entity/实体更新导致无法预览的问题

    最近改动了某个entity的类型,取消了它的继承,preview突然就停止工作了,一直提示crash,直接调用以下方法,清除之前的preview设定即可,因为preview里还保存了旧的设定,与新设定冲突,导致preview crash
    [code language=”shell”]
    xcrun simctl –set previews delete all
    [/code]

  • 如何在SwiftUI中给字体加粗

    swiftUI的文本设置,给了非常简单易懂的字体选择器,而如果想给字体加粗,该如何实现呢

    这里就可以这样设置

    [code language=”python”]
    TextField("Name", text: $name)
    .font(Font.headline.weight(.light))
    [/code]

    而可以选择的字体大小的,有如下的从小到大的名称
    [code language=”css”]
    .caption
    .footnote
    .subheadline
    .callout
    .body
    .headline
    .title
    .largeTitle
    [/code]

    而字体粗细的选择,则有如下从细到粗的字段可选
    [code language=”css”]
    .ultralight
    .thin
    .light
    .regular
    .medium
    .semibold
    .bold
    .heavy
    .black
    [/code]