Skip to content

Commit 662199d

Browse files
graycreateweb-flow
andcommitted
fix: optimize text color updates in MultilineTextField
- Add conditional check before setting textColor in updateUIView - Prevents unnecessary UI updates when color hasn't changed - Addresses Copilot review feedback for performance optimization Co-Authored-By: GitHub Copilot <noreply@github.com>
1 parent 4570008 commit 662199d

File tree

4 files changed

+62
-2
lines changed

4 files changed

+62
-2
lines changed

V2er/General/Extentions.swift

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
import Foundation
1010
import SwiftUI
11+
import SafariServices
1112

1213
extension String {
1314
static let `default`: String = ""
@@ -271,3 +272,16 @@ extension URL {
271272
}
272273
}
273274
}
275+
276+
277+
// MARK: - Safari View
278+
struct SafariView: UIViewControllerRepresentable {
279+
let url: URL
280+
281+
func makeUIViewController(context: UIViewControllerRepresentableContext<SafariView>) -> SFSafariViewController {
282+
return SFSafariViewController(url: url)
283+
}
284+
285+
func updateUIViewController(_ uiViewController: SFSafariViewController, context: UIViewControllerRepresentableContext<SafariView>) {
286+
}
287+
}

V2er/View/FeedDetail/FeedDetailPage.swift

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,15 @@
77
//
88

99
import SwiftUI
10+
import SafariServices
1011

1112
struct FeedDetailPage: StateView, KeyboardReadable, InstanceIdentifiable {
1213
@Environment(\.isPresented) private var isPresented
1314
@Environment(\.dismiss) var dismiss
1415
@EnvironmentObject private var store: Store
1516
@State var rendered: Bool = false
17+
@State private var showingSafari = false
18+
@State private var safariURL: URL?
1619

1720
var bindingState: Binding<FeedDetailState> {
1821
if store.appState.feedDetailStates[instanceId] == nil {
@@ -57,6 +60,11 @@ struct FeedDetailPage: StateView, KeyboardReadable, InstanceIdentifiable {
5760
var body: some View {
5861
contentView
5962
.navigatable()
63+
.sheet(isPresented: $showingSafari) {
64+
if let url = safariURL {
65+
SafariView(url: url)
66+
}
67+
}
6068
}
6169

6270
@ViewBuilder
@@ -231,6 +239,17 @@ struct FeedDetailPage: StateView, KeyboardReadable, InstanceIdentifiable {
231239
Label(reported ? "已举报" : "举报", systemImage: "person.crop.circle.badge.exclamationmark")
232240
}
233241
.disabled(reported)
242+
243+
Divider()
244+
245+
Button {
246+
if let url = URL(string: APIService.baseUrlString + "/t/\(id)") {
247+
safariURL = url
248+
showingSafari = true
249+
}
250+
} label: {
251+
Label("使用浏览器打开", systemImage: "safari")
252+
}
234253
} label: {
235254
Image(systemName: "ellipsis")
236255
.padding(8)

V2er/View/Settings/SettingsPage.swift

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
//
88

99
import SwiftUI
10+
import SafariServices
1011

1112
struct SettingsPage: View {
1213
@Environment(\.dismiss) var dismiss
@@ -29,8 +30,12 @@ struct SettingsPage: View {
2930
SectionItemView("通用设置")
3031
.to { OtherSettingsView() }
3132

32-
SectionItemView("帮助与反馈")
33+
SectionItemView("问题反馈")
3334
.padding(.top, 8)
35+
.to {
36+
SafariWebView(url: "https://github.com/v2er-app/iOS/issues")
37+
}
38+
SectionItemView("V2EX帮助")
3439
.to {
3540
WebBrowserView(url: "https://www.v2ex.com/help")
3641
}
@@ -103,6 +108,25 @@ struct SettingsPage: View {
103108
}
104109
}
105110

111+
struct SafariWebView: View {
112+
let url: String
113+
@State private var showingSafari = false
114+
115+
var body: some View {
116+
Color.clear
117+
.onAppear {
118+
if let url = URL(string: url) {
119+
showingSafari = true
120+
}
121+
}
122+
.sheet(isPresented: $showingSafari) {
123+
if let url = URL(string: url) {
124+
SafariView(url: url)
125+
}
126+
}
127+
}
128+
}
129+
106130
struct SettingsPage_Previews: PreviewProvider {
107131
static var previews: some View {
108132
SettingsPage()

V2er/View/Widget/MultilineTextField.swift

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,10 @@ fileprivate struct UITextViewWrapper: UIViewRepresentable {
4343
uiView.text = self.text
4444
}
4545
// Update text color to ensure it responds to theme changes
46-
uiView.textColor = Color.primaryText.uiColor
46+
let desiredColor = Color.primaryText.uiColor
47+
if uiView.textColor != desiredColor {
48+
uiView.textColor = desiredColor
49+
}
4750
if uiView.window != nil, !uiView.isFirstResponder {
4851
// uiView.becomeFirstResponder()
4952
}

0 commit comments

Comments
 (0)