修改跳转的逻辑
This commit is contained in:
parent
b11362b912
commit
72d73f9a2f
@ -23,4 +23,25 @@ final class AppNavigation: ObservableObject {
|
|||||||
path.append(dest)
|
path.append(dest)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func handleNotification(_ userInfo: [AnyHashable: Any]) {
|
||||||
|
print(userInfo)
|
||||||
|
guard let customData = userInfo["custom_data"] as? [String: AnyObject],
|
||||||
|
let target = customData["target"] as? String,
|
||||||
|
let params = customData["params"] as? [String : AnyObject] else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
path = NavigationPath()
|
||||||
|
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { [self] in
|
||||||
|
switch target {
|
||||||
|
case "detail":
|
||||||
|
if let dramaId = params["drama_id"] as? Int {
|
||||||
|
path.append(Destination.detail(id: dramaId))
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -29,7 +29,6 @@ struct SearchBar: View {
|
|||||||
if !searchText.isEmpty {
|
if !searchText.isEmpty {
|
||||||
doSearch()
|
doSearch()
|
||||||
isFirstResponder = false
|
isFirstResponder = false
|
||||||
print("isFirstResponder is set false")
|
|
||||||
}
|
}
|
||||||
} label: {
|
} label: {
|
||||||
Text("搜索")
|
Text("搜索")
|
||||||
@ -71,7 +70,6 @@ struct ControlledTextField: UIViewRepresentable {
|
|||||||
uiView.text = text
|
uiView.text = text
|
||||||
context.coordinator.isUpdatingFromBinding = false
|
context.coordinator.isUpdatingFromBinding = false
|
||||||
}
|
}
|
||||||
print("call me update UIView: \(isFirstResponder)")
|
|
||||||
|
|
||||||
// 2. 焦点控制优化
|
// 2. 焦点控制优化
|
||||||
if isFirstResponder {
|
if isFirstResponder {
|
||||||
@ -113,12 +111,16 @@ struct ControlledTextField: UIViewRepresentable {
|
|||||||
|
|
||||||
// 失去焦点
|
// 失去焦点
|
||||||
func textFieldDidEndEditing(_ textField: UITextField, reason: UITextField.DidEndEditingReason) {
|
func textFieldDidEndEditing(_ textField: UITextField, reason: UITextField.DidEndEditingReason) {
|
||||||
self.isFirstResponder = false
|
DispatchQueue.main.async {
|
||||||
|
self.isFirstResponder = false
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
|
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
|
||||||
onCommit()
|
onCommit()
|
||||||
self.isFirstResponder = false
|
DispatchQueue.main.async {
|
||||||
|
self.isFirstResponder = false
|
||||||
|
}
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -19,13 +19,9 @@ struct SearchView: View {
|
|||||||
|
|
||||||
// 是否显示搜索结果
|
// 是否显示搜索结果
|
||||||
@State private var showSearchResult: Bool = false
|
@State private var showSearchResult: Bool = false
|
||||||
|
|
||||||
// 控制是否需要显示键盘
|
|
||||||
@State private var showKeyboard: Bool = true
|
|
||||||
|
|
||||||
@State private var toolbarID = UUID()
|
|
||||||
|
|
||||||
// 键盘焦点的控制
|
// 键盘焦点的控制
|
||||||
|
@State private var toolbarID = UUID()
|
||||||
@State private var isFocused: Bool = true
|
@State private var isFocused: Bool = true
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
@ -69,16 +65,13 @@ struct SearchView: View {
|
|||||||
SearchBar(isFirstResponder: $isFocused, searchText: $searchText) {
|
SearchBar(isFirstResponder: $isFocused, searchText: $searchText) {
|
||||||
doSearch()
|
doSearch()
|
||||||
}
|
}
|
||||||
|
.frame(width: UIScreen.main.bounds.width * 0.8)
|
||||||
.id(toolbarID)
|
.id(toolbarID)
|
||||||
.onAppear {
|
|
||||||
print("searchBar appear")
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.padding(.horizontal, 12)
|
.padding(.horizontal, 12)
|
||||||
.ignoresSafeArea(.keyboard, edges: .bottom) // 避免键盘遮挡
|
.ignoresSafeArea(.keyboard, edges: .bottom) // 避免键盘遮挡
|
||||||
.onAppear {
|
.onAppear {
|
||||||
print("main appear")
|
|
||||||
toolbarID = UUID()
|
toolbarID = UUID()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -94,9 +87,6 @@ struct SearchView: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 其他情况下不自动弹出键盘
|
|
||||||
self.showKeyboard = false
|
|
||||||
|
|
||||||
// 可选:添加历史记录
|
// 可选:添加历史记录
|
||||||
// let history = SearchHistory(keyword: trimmed, timestamp: Date())
|
// let history = SearchHistory(keyword: trimmed, timestamp: Date())
|
||||||
// modelContext.insert(history)
|
// modelContext.insert(history)
|
||||||
|
|||||||
@ -12,7 +12,7 @@ import Observation
|
|||||||
@main
|
@main
|
||||||
struct dimensionhubApp: App {
|
struct dimensionhubApp: App {
|
||||||
@UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
|
@UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
|
||||||
@StateObject var appNav = AppNavigation()
|
@StateObject var appNav = AppNavigation.shared
|
||||||
|
|
||||||
var sharedModelContainer: ModelContainer = {
|
var sharedModelContainer: ModelContainer = {
|
||||||
let schema = Schema([
|
let schema = Schema([
|
||||||
@ -167,22 +167,8 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterD
|
|||||||
}
|
}
|
||||||
|
|
||||||
// MARK: 消息处理
|
// MARK: 消息处理
|
||||||
|
|
||||||
private func handleRemoteNotification(userInfo: [AnyHashable: Any]) {
|
private func handleRemoteNotification(userInfo: [AnyHashable: Any]) {
|
||||||
guard let customData = userInfo["custom_data"] as? [String: AnyObject],
|
AppNavigation.shared.handleNotification(userInfo)
|
||||||
let target = customData["target"] as? String,
|
|
||||||
let params = customData["params"] as? [String : AnyObject] else {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
switch target {
|
|
||||||
case "detail":
|
|
||||||
if let dramaId = params["drama_id"] as? Int {
|
|
||||||
AppNavigation.shared.append(dest: .detail(id: dramaId))
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private func handleDeepLink(_ link: String) {
|
private func handleDeepLink(_ link: String) {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user