我有一个带有两个文本的简单小部件(中等大小),我想要的是能够执行深层链接以将用户引导到我的应用程序的特定部分,但我似乎找不到方法这样做。
我写的视图(非常简单):
HStack {
Text("FIRST ITEM")
Spacer()
Text("SECOND ITEM")
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试更换
Text("SECOND ITEM")
Run Code Online (Sandbox Code Playgroud)
和
Link("SECOND ITEM destination: URL(string: myDeeplinkUrl)!)
Run Code Online (Sandbox Code Playgroud)
但它也不起作用。
经过一些研究,我发现我的应用程序使用了太多的能量,因为UIView整个应用程序中有几个动画,我在完成块中捕获了相关的动画UIViewController,而没有对其进行弱引用。
所以实际上,我改变了这一点:
func animate() {
UIView.animate(withDuration: 0.3, animations: {
self.label.alpha = 0.5
}) { _ in
self.animate()
}
}
Run Code Online (Sandbox Code Playgroud)
进入这个:
func animate() {
UIView.animate(withDuration: 0.3, animations: {
self.label.alpha = 0.5
}) { [weak self] _ in
self?.animate()
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我想知道我是否需要对animation块(self.label.alpha = 0.5那个)做同样的事情?
感谢您的帮助
我有一个表单来选择一些用户并为他们分配一个 int 值。
该模型:
class ReadingTime: Identifiable, Hashable {
var id: Int
@State var user: User
@Published var value: Int
func hash(into hasher: inout Hasher) {
hasher.combine(id)
}
static func == (lhs: ReadingTime, rhs: ReadingTime) -> Bool {
lhs.id == rhs.id
}
init(id: Int, user: User, value: Int) {
self.id = id
self._user = State(wrappedValue: user)
self.value = value
}
}
Run Code Online (Sandbox Code Playgroud)
风景:
@Binding var times: [ReadingTime]
@State var newUser: User?
func didSelect(_ user: User?) {
if let user = user …Run Code Online (Sandbox Code Playgroud) 我试图写一个像这样的静态函数:
enum NavigationViewKind {
case test1(String)
case test2
}
struct NavigationViewManager {
static func make<V: View>(_ kind: NavigationViewKind, _ contentView: @escaping () -> V) -> some View {
switch kind {
case .test1(let text):
return NavigationView {
contentView()
.navigationBarTitle(text, displayMode: .inline)
}
case .test2:
return NavigationView {
contentView()
.navigationBarTitle("Initial", displayMode: .large)
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
但我收到此错误:
函数声明了一个不透明的返回类型,但其主体中的返回语句没有匹配的底层类型
你能帮我理解和解决这个错误吗?
谢谢
我想水平堆叠重叠的元素,如下所示:
这是我尝试过的:
struct StackedElementsView: View {
let colors: [Color] = [.red, .blue, .purple]
var body: some View {
HStack {
ZStack {
ForEach(0..<colors.count) { i in
ZStack(alignment: .leading) {
colors[i]
.clipShape(Circle())
.frame(width: 44, height: 44)
}
.offset(x: CGFloat(i) * 25)
}
}
.padding(.leading, 24)
Color.purple
.frame(width: 100, height: 44)
Spacer()
}
.padding(.vertical, 8)
}
}
struct StackedElementsView_Previews: PreviewProvider {
static var previews: some View {
StackedElementsView()
}
}
Run Code Online (Sandbox Code Playgroud)
我对此有一个问题,紫色矩形与圆圈重叠,我不知道为什么。
感谢您的帮助
我想创建一个带有边框和背景颜色的圆角矩形视图的按钮。
到目前为止我写了这个:
Button(action: {
}, label: {
Text("TAP ME")
.foregroundColor(Color.blue)
})
.frame(height: 50)
.frame(maxWidth: .infinity)
.overlay(
RoundedRectangle(cornerRadius: 50, style: .continuous)
.strokeBorder(Color.blue, lineWidth: 1)
)
Run Code Online (Sandbox Code Playgroud)
我试图.background(Color.red)在许多不同的地方添加,但这是我每次得到的:
在这里做什么?
感谢您的帮助
我正在按照教程来了解 SwiftUI,特别是如何在视图出现时调用 API。
我看到了这个:
List(results, id: \.trackId) { item in
ListRow(item)
}
.task {
// perform API here
}
Run Code Online (Sandbox Code Playgroud)
但由于我的应用程序面向 iOS 14,我收到此错误:
“task(priority:_:)”仅在 iOS 15.0 或更高版本中可用
那么我能做什么呢?感谢您的帮助
我有一个单元格垂直间距为 10 像素的设计。我想在这些单元格周围设置阴影(实际上我将这些阴影应用到每个单元格的子视图),但这是我得到的结果:
正如您所看到的,阴影被其他单元格和表视图页眉/页脚切断。
这是我的代码:
视图控制器
final class SCVC: UIViewController {
@IBOutlet weak var tableView: UITableView! {
didSet {
tableView.backgroundColor = .clear
tableView.separatorStyle = .none
}
}
override func viewDidLoad() {
tableView.register(UINib(nibName: "ShadowCell", bundle: .main), forCellReuseIdentifier: "ShadowCell")
view.backgroundColor = .white
}
}
extension SCVC: UITableViewDataSource, UITableViewDelegate {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 4
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
return tableView.dequeueReusableCell(withIdentifier: "ShadowCell", for: indexPath) as! ShadowCell
}
func tableView(_ …Run Code Online (Sandbox Code Playgroud) 我有一个UIViewController显示一个UIDocumentPicker选择PDF文件的文件,并包含一个UICollectionView显示它们的文件(每个单元格都包含一个PDFView来执行此操作)。
这是代码:
import MobileCoreServices; import PDFKit; import UIKit
class ViewController: UIViewController {
var urls: [URL] = []
@IBOutlet weak var collectionView: UICollectionView!
@IBAction func pickFile() {
DispatchQueue.main.async {
let documentPicker = UIDocumentPickerViewController(documentTypes: [kUTTypePDF as String], in: .import)
documentPicker.delegate = self
documentPicker.modalPresentationStyle = .formSheet
self.present(documentPicker, animated: true, completion: nil)
}
}
override func viewDidLoad() {
collectionView.register(UINib(nibName: PDFCollectionViewCell.identifier, bundle: .main),
forCellWithReuseIdentifier: PDFCollectionViewCell.identifier)
}
init() { super.init(nibName: "ViewController", bundle: .main) }
required init?(coder: NSCoder) { …Run Code Online (Sandbox Code Playgroud) 我想将变量从父视图传递到子视图,但在此子视图中,在文本字段中使用它,但仅在按下“保存”按钮时更新此值。
我试过这个:
父视图
struct ParentView: View {
@State private var name: String = ""
var body: some View {
HStack {
Text("User name: \(name)")
Spacer()
NavigationLink(
destination: ChildView(name: name),
label: {
Text("Update name")
}
)
}
}
}
Run Code Online (Sandbox Code Playgroud)
子视图
struct ChildView: View {
@State private var name: String = ""
@Binding var passedName: String
var body: some View {
VStack {
Form {
TextField("Update name", text: $name)
Button(action: {
passedName = name
}, label: {
Text("SAVE")
})
}
}
} …Run Code Online (Sandbox Code Playgroud) 假设我有一个包含在另一个线程中调用的一些指令的函数,例如后台线程:
func myFunc(_ completion: @escaping (() -> ())) {
anyActionFromBackgroundThread {
DispatchQueue.main.async {
completion()
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我在某处调用此函数:
myFunc {
self.tableView.reloadData() // or any UI action
}
Run Code Online (Sandbox Code Playgroud)
通过这样做,我确定tableView.reloadData()将从主线程调用此处的 UI 操作吗?还是我需要在完成中添加一个检查?
感谢您的帮助
我正在努力理解新型ResultSwift 的工作原理。这是我尝试过的:
enum MyError: Error {
case test
}
typealias MyResult = Result<Data?, MyError?>
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
输入“我的错误?” 不符合协议“错误”
为什么会这样?感谢您的帮助。
这是这个简单的例子:
let i: [String: [Int]] = ["a": [1, 3, 6, 10],
"b": [3, 4, 8, 12]]
Run Code Online (Sandbox Code Playgroud)
我想创建一个新字典,过滤数组以只获取小于 7 的值。我写了这个:
var j: [String: [Int]] {
var result = [String: [Int]]()
i.forEach { key, value in
result[key] = value.filter({ $0 < 7 })
}
return result
}
Run Code Online (Sandbox Code Playgroud)
但是,我想知道是否有更简单,更优雅的方法来做到这一点?
感谢您的帮助!