#swift #list #image #exc-bad-access
#swift #Список #изображение #исключение-плохой доступ
Вопрос:
Я добавил значки системных дисков (NSImage) в свой список дисков
Теперь приложение выходит из строя в AppDelegate.swift в строке 13 class AppDelegate: NSObject, NSApplicationDelegate {
с Thread 1: EXC_BAD_ACCESS (code=2, address=0x7ffeef3fff48)
Я знаю, что я добавляю изображения, потому что, когда я заменяю их текстом, все в порядке
Вот класс, в который я добавляю изображения.
import SwiftUI
let workspace = NSWorkspace.init()
struct DriveList: View {
let drives = SDCardTools.getDrives()!
var body: some View {
return List(drives) { drive in
DriveRow(drive : drive)
}
}
}
struct DriveRow: View {
var drive : Drive
var body: some View {
HStack {
DriveIcon(path : drive.path)
padding(10)
Text(drive.name)
}
}
}
struct DriveIcon : View {
var path: String
var body: some View {
Image(nsImage: workspace.icon(forFile: path ))
.resizable()
.frame(width: 50, height: 50)
}
}
struct DriveList_Previews: PreviewProvider {
static var previews: some View {
DriveList()
}
}
Очередь потока 1: com.apple.main-поток (последовательный)
#0 0x00007fff44382883 в специализированной статической среде Readingview._makeView(просмотр:входные данные:) ()
#1 0x00007fff44384668 в свидетеле протокола для статического просмотра._makeView(просмотр: входные данные:) в изображении соответствия ()
#2 0x00007fff44384610 в свидетеле протокола для статического просмотра._makeView(просмотр: входные данные:) в изображении соответствия ()
#3 0x00007fff441c20e9 в TypedUnaryViewGenerator.makeView(в:входные данные: идентификатор: Косвенная карта:) ()
#4 0x00007fff441c21f9 в свидетеле протокола для UnaryViewGenerator.makeView(в: входы: идентификатор: Косвенная карта:) в соответствии с типом unaryviewgenerator ()
#5 0x00007fff441bc9b0 в закрытии #1 в UnaryElements.makeElements(из: в: входы: Косвенная карта:тело:) ()
#6 0x00007fff441c4801 в частичной заявке на закрытие #1 в UnaryElements.makeElements(из: в: входы: Косвенная карта:тело:) ()
#7 0x00007fff441bf61b в закрытии #1 в закрытии #1 в закрытии #1 в закрытии # 1 в закрытии #1 в ModifiedElements.makeElements(из:in:inputs:indirectMap:body:) ()
#8 0x00007fff441ce4c5 в частичной подаче заявки на закрытие # 1 в закрытии #1 в закрытии # 1 в закрытии # 1 в ModifiedElements.makeElements(из:in:inputs:indirectMap:body:) ()
#9 0x00007fff445adb15 в специализированном статическом UnaryLayout<>.makeViewImpl(модификатор:входные данные: тело:) ()
#10 0x00007fff4430e339 в специализированном статическом UnaryLayout._makeView(модификатор: входные данные: тело:) ()
#11 0x00007fff4430f101 в свидетеле протокола для статического ViewModifier._makeView(модификатор: входные данные: тело:) в соответствии с _AspectRatioLayout ()
#12 0x00007fff4430eec8 в свидетеле протокола для статического ViewModifier._makeView(модификатор: входные данные: тело:) в соответствии с _FrameLayout ()
#13 0x00007fff441bf2a5 в закрытии #1 в закрытии #1 в закрытии #1 в ModifiedElements.makeElements(из:в: входы: Косвенная карта:тело:) ()
#14 0x00007fff441ce43d в частичной подаче заявки на закрытие # 1 в закрытии #1 в закрытии # 1 в ModifiedElements.makeElements(из:in:inputs:indirectMap:body:) ()
#15 0x00007fff441813ef в закрытии #2 в статическом _Layout<>.makeStaticView(root:входные данные:список:) ()
Любая помощь, которую вы можете предоставить, будет с благодарностью оценена 🙂
Комментарии:
1. Обычно это очень полезно, когда вы также предоставляете некоторую информацию с консоли 😉
2. (lldb) — это все, что есть в консоли, но я добавил сведения о потоке в сообщение
3. Не могли бы вы сделать это в качестве воспроизводимого примера, чтобы любой мог протестировать локально? Кроме того, где расположены эти значки?
4. Это системные значки для дисков. Я могу загрузить его в bit bucket, чтобы вы могли взглянуть
5. Спасибо @Asperi, вы можете клонировать его из кода , чтобы вы могли взглянуть
Ответ №1:
Ошибка очень запутанная, она связана с неотчуждаемой природой padding
модификатора… и компилятор передает его без использования в качестве фактического модификатора, что приводит к сбою.
Вот исправление
struct DriveRow: View {
var drive : Drive
var body: some View {
HStack {
DriveIcon(path : drive.path)
.padding(10) // << in this line you missed '.' dot
Text(drive.name)
}
}
}
Комментарии:
1. Спасибо, но я только что попробовал, но все та же проблема. Но все равно очень полезно знать 🙂
2. Спасибо, Аспери, я посмотрю сегодня вечером. Очень признателен 🙂
3. Это сработало. Спасибо Asperi. Думаю, я ожидал, что Xcode подберет что-то подобное! В следующий раз я буду следить за ошибками такого рода!
4. Работает для меня. У меня не было точки для onTapGesture, и это привело к сбою во время выполнения, а не к ошибке компиляции. Невероятно
5. Я потратил некоторое время на аналогичную проблему, а затем обнаружил это. Спасибо. ТОЧКА? Я думаю, что Xcode должен кричать на меня в первую очередь.