У меня проблема с производительностью (я думаю) моего виджета. Позвольте мне сначала объяснить, чего я хочу достичь.
Я пытаюсь создать интерактивный виджет, который действует как калькулятор. Код работает хорошо, но виджет не очень отзывчив, если я пытаюсь быстро нажать кнопки.
Я нашел хороший пример, такой как этот, который работает хорошо при быстром нажатии кнопок: https://apps.apple.com/us/app/calculato ... 6465680493
Есть ли у вас предложения по возможным улучшениям? Я думал о производительности пользовательских настроек по умолчанию, но не знал, что и думать, так как использую там лишь некоторые базовые вещи.
Спасибо за помощь.
Вот намерение, которое я использую при нажатии кнопок:
struct CalculatorDigitIntent: AppIntent {
static var title: LocalizedStringResource = "Calculator"
@Parameter(title: "Digit")
var digit: String
init() {}
init(digit: String) {
self.digit = digit
}
func perform() async throws -> some IntentResult {
UserDefaults.standard.double(forKey: "calculatorAmount")
var calculatorAmount = UserDefaults.standard.double(forKey: "calculatorAmount")
switch digit {
case "00":
if calculatorAmount != 0 {
calculatorAmount *= 100
}
case "0", "1", "2", "3", "4", "5", "6", "7", "8", "9":
if let digit = Double(digit) {
if calculatorAmount != 0 || digit != 0 {
calculatorAmount = calculatorAmount * 10 + digit
}
}
default:
break
}
UserDefaults.standard.set(calculatorAmount, forKey: "calculatorAmount")
return .result()
}
}
Вот поставщик временной шкалы:
struct CalculatorProvider: AppIntentTimelineProvider {
func placeholder(in context: Context) -> FXWCalculatorEntry {
CalculatorEntry(date: Date(), amount: 0.0)
}
func snapshot(for configuration: ConfigurationAppIntent, in context: Context) async -> CalculatorEntry {
CalculatorEntry(date: Date(), amount: 0.0)
}
func timeline(for configuration: ConfigurationAppIntent, in context: Context) async -> Timeline {
let digits = getCalculatorDigits()
let entry = CalculatorEntry(date: Date(), amount: digits)
let timeline = Timeline(entries: [entry], policy: .never)
return timeline
}
func getCalculatorDigits() -> Double {
return UserDefaults.standard.double(forKey: "calculatorAmount")
}
}
Насколько я понимаю из документации, каждый раз, когда вызывается намерение приложения, временная шкала будет обновляться.
В моем коде представления я просто есть простые кнопки, подобные этой:
Button(intent: CalculatorDigitIntent(digit: "4")) {
Text("4")
.font(.system(size: 20).bold())
.foregroundStyle(Color(hex: "#252F2C"))
}
Подробнее здесь: https://stackoverflow.com/questions/790 ... pp-intents
Улучшение отзывчивости интерактивного виджета SwiftUI при использовании намерений приложения. ⇐ IOS
Программируем под IOS
1727068243
Anonymous
У меня проблема с производительностью (я думаю) моего виджета. Позвольте мне сначала объяснить, чего я хочу достичь.
Я пытаюсь создать интерактивный виджет, который действует как калькулятор. Код работает хорошо, но виджет не очень отзывчив, если я пытаюсь быстро нажать кнопки.
Я нашел хороший пример, такой как этот, который работает хорошо при быстром нажатии кнопок: https://apps.apple.com/us/app/calculator-widget-simple-calc/id6465680493
Есть ли у вас предложения по возможным улучшениям? Я думал о производительности пользовательских настроек по умолчанию, но не знал, что и думать, так как использую там лишь некоторые базовые вещи.
Спасибо за помощь.
Вот намерение, которое я использую при нажатии кнопок:
struct CalculatorDigitIntent: AppIntent {
static var title: LocalizedStringResource = "Calculator"
@Parameter(title: "Digit")
var digit: String
init() {}
init(digit: String) {
self.digit = digit
}
func perform() async throws -> some IntentResult {
UserDefaults.standard.double(forKey: "calculatorAmount")
var calculatorAmount = UserDefaults.standard.double(forKey: "calculatorAmount")
switch digit {
case "00":
if calculatorAmount != 0 {
calculatorAmount *= 100
}
case "0", "1", "2", "3", "4", "5", "6", "7", "8", "9":
if let digit = Double(digit) {
if calculatorAmount != 0 || digit != 0 {
calculatorAmount = calculatorAmount * 10 + digit
}
}
default:
break
}
UserDefaults.standard.set(calculatorAmount, forKey: "calculatorAmount")
return .result()
}
}
Вот поставщик временной шкалы:
struct CalculatorProvider: AppIntentTimelineProvider {
func placeholder(in context: Context) -> FXWCalculatorEntry {
CalculatorEntry(date: Date(), amount: 0.0)
}
func snapshot(for configuration: ConfigurationAppIntent, in context: Context) async -> CalculatorEntry {
CalculatorEntry(date: Date(), amount: 0.0)
}
func timeline(for configuration: ConfigurationAppIntent, in context: Context) async -> Timeline {
let digits = getCalculatorDigits()
let entry = CalculatorEntry(date: Date(), amount: digits)
let timeline = Timeline(entries: [entry], policy: .never)
return timeline
}
func getCalculatorDigits() -> Double {
return UserDefaults.standard.double(forKey: "calculatorAmount")
}
}
Насколько я понимаю из документации, каждый раз, когда вызывается намерение приложения, временная шкала будет обновляться.
В моем коде представления я просто есть простые кнопки, подобные этой:
Button(intent: CalculatorDigitIntent(digit: "4")) {
Text("4")
.font(.system(size: 20).bold())
.foregroundStyle(Color(hex: "#252F2C"))
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79013230/improving-interactive-swiftui-widget-responsiveness-when-using-app-intents[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия