SwiftUI macOS - 创建可点击的超链接

标签 swift macos swiftui

我想在我的 macOS 应用程序中显示一个用户可以点击的 url。我到目前为止是这样的:

Text(url)
.onTapGesture {
    if let url = URL(string: self.url) {
        NSWorkspace.shared.open(url)
    }
}

但是,这不会向用户提供该 url 可点击的视觉指示。我希望文本带有下划线,并且当用户将鼠标悬停在它上面时,我希望光标变为一只手。我该怎么做?

编辑:

我找到了一个自定义扩展,用于有条件地将修饰符应用于 swift forums 中的 View 。 :


extension View {

    func `if`<Content: View>(_ conditional: Bool, content: (Self) -> Content) -> some View {
        if conditional {
            return AnyView(content(self))
        } else {
            return AnyView(self)
        }
    }

}

将它与@Asperi 的回答结合后,我现在有了这个:


@State private var isHoveringOverURL = false

Button(action: {
    if let url = URL(string: self.url) {
        NSWorkspace.shared.open(url)
    }

}) {
    Text(self.url)
        .font(.caption)
        .foregroundColor(Color.blue)
        .if(isHoveringOverURL) {
            $0.underline()
        }

}
.buttonStyle(PlainButtonStyle())
.onHover { inside in
    if inside {
        self.isHoveringOverURL = true
        NSCursor.pointingHand.push()
    } else {
        self.isHoveringOverURL = false
        NSCursor.pop()
    }
}

preview

最佳答案

这是可能的解决方案。使用 Xcode 11.4/macOS 10.15.4 测试

demo

Button(action: {
   // link action here
}) {
    Text("www.stackoverflow.com").underline()
        .foregroundColor(Color.blue)
}.buttonStyle(PlainButtonStyle())
.onHover { inside in
    if inside {
        NSCursor.pointingHand.push()
    } else {
        NSCursor.pop()
    }
}

关于SwiftUI macOS - 创建可点击的超链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62112868/

相关文章:

ios - 选择器不会从CoreData(SwiftUI)中选择值

ios - SwiftUI:动画期间的文本问题

ios - 如何从模型中的函数接收 View 中的异步结果?

swift - 视觉效果窗口和标签

android - 编译 irrlicht 时出错 - android 端口 (Mac OSX)

swift - 如何检测NSWindow是否被拖动?

swift - UICollectionViewTransitionLayout 和 contentOffset 完成

swift - 无法处理 NSPhotoLibraryAddUsageDescription 的权限

swift - : and = 之间的差异

macos - 从终端运行 Sublime Text 3 时如何解决 Permission Denied?