Skip to content

Commit 1f670e2

Browse files
committed
Добавил код для статьи № 106
1 parent bf9b7b7 commit 1f670e2

File tree

3 files changed

+75
-1
lines changed

3 files changed

+75
-1
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ https://oleg991.medium.com/100-отслеживаем-жизненный-цик
109109
103. Памятка по публикации в TestFlight (2025), [medium](https://oleg991.medium.com/c56fcf15a051)
110110
104. Показываем алерт в отдельном окне, [medium](https://medium.com/@oleg991/104-показываем-алерт-в-отдельном-окне-7707cef2a8bc)
111111
105. GitHub Actions для юнит-тестов, [medium](https://medium.com/@oleg991/105-github-actions-для-юнит-тестов-f3b9f09cefb5)
112+
106. Баг с лишней перерисовкой View, [medium](https://oleg991.medium.com/31a74a96f934)
112113

113114
## Про меня
114115
- Статья 1 - как я пришел в iOS-разработку, [boosty](https://boosty.to/oleg991/posts/52e071f3-68bd-43ea-95a3-5c834f180939?share=post_link)
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
import SwiftUI
2+
3+
/*
4+
Проблема: если нажать на searchBar, и потом открыть экран с кругом, то при закрытии модалки свайпом произойдет пересоздание экрана с "кругом", что приведет к вызову всех событий onAppear/task, и отмене таска, соответственно.
5+
6+
Решение: не использовать стандартный модификатор searchable, или заменить NavigationView на NavigationStack (iOS 16+), или сделать кастомные модалки, или игнорировать ошибку -999.
7+
*/
8+
struct SearchableBugExample: View {
9+
@State private var showSheet = false
10+
11+
var body: some View {
12+
NavigationView {
13+
Button("Открыть модалку") {
14+
showSheet.toggle()
15+
}
16+
.sheet(isPresented: $showSheet) {
17+
NavigationView {
18+
InnerModalView()
19+
}
20+
}
21+
.navigationTitle("Главный экран")
22+
}
23+
}
24+
}
25+
26+
private struct InnerModalView: View {
27+
var body: some View {
28+
NavigationLink(destination: DemoViewWithTask()) {
29+
Text("Открыть вьюху с таском")
30+
}
31+
.navigationTitle("Модалка")
32+
.searchable(
33+
text: .constant(""),
34+
placement: .navigationBarDrawer(displayMode: .always),
35+
prompt: ""
36+
)
37+
}
38+
}
39+
40+
private struct DemoViewWithTask: View {
41+
@State private var counter = 0
42+
43+
var body: some View {
44+
Self._printChanges()
45+
return Circle().frame(width: 300, height: 300)
46+
.overlay {
47+
VStack {
48+
Text("Счетчик: \(counter)")
49+
Button("Увеличить счетчик") {
50+
counter += 1
51+
print("счетчик: \(counter)")
52+
}
53+
.buttonStyle(.borderedProminent)
54+
}
55+
.background(.white)
56+
}
57+
.onAppear {
58+
logEvent("onAppear")
59+
}
60+
.task {
61+
logEvent("task")
62+
}
63+
}
64+
65+
private func logEvent(_ event: String) {
66+
print(event)
67+
print("counter: \(counter)")
68+
}
69+
}
70+
71+
#Preview {
72+
SearchableBugExample()
73+
}

Shared SwiftUI Content/Shared_SwiftUI_ContentApp.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import SwiftUI
44
struct Shared_SwiftUI_ContentApp: App {
55
var body: some Scene {
66
WindowGroup {
7-
ScenePhaseExample()
7+
SearchableBugExample()
88
}
99
}
1010
}

0 commit comments

Comments
 (0)