inputAccessoryView 在 alertController (actionSheet) 呈现时动画化

问题描述 投票:0回答:4

我有一个聊天应用程序的 inputAccessoryView,它始终保持可见并停靠在屏幕底部,用于类似于大多数消息传递应用程序的文本输入。

当我呈现带有 actionSheet 样式的 alertController 时,inputAccessoryView 在呈现警报时在屏幕外进行动画处理,然后在解除警报时再次备份。这反过来滚动我的 tableView 并且是不可取的。

发生这种情况是因为聊天 viewController 在出现警报时放弃了 firstResponder。

有没有呈现一个 alertController 并且不放弃 firstResponder,或者无论如何在它的视图 resignsFirstResponder 时保持 inputAccessoryView 停靠在屏幕底部?

ios swift xcode uialertcontroller inputaccessoryview
4个回答
13
投票

InputAccessoryView
位于 ViewController 的层次结构之外 - 它包含在
UITextEffectsWindow
中,其 rootViewController 是一个
UIInputWindowController
。同样,键盘包含在
UIRemoteKeyboardWindow
和它自己的
UIInputWindowController
中。

所以,如果我们从最顶层的窗口或更高的窗口(

UITextEffectsWindow
UIRemoteKeyboardWindow
)显示警报,它不会退出第一响应者。

我找到的最简单的解决方案是:

let topViewController = UIApplication.shared.windows.last!.rootViewController!
topViewController.present(alert, animated: true, completion: nil)

理想情况下,您可以安全地处理这些可选值。一个可能更好的解决方案(我从以前的解决方案中看到了一些控制台错误)是创建一个具有更高 WindowLevel 的新 UIWindow,使其成为关键窗口并可见,并从那里显示警报。


2
投票

感谢@Corey W.(给他投票)我们有一个解决这个问题的方法。 Swift 5 中更安全的方法:

// Instantiate AlertController
let actionSheet = UIAlertController(title: title,
                                    message: "Comment options",
                                    preferredStyle: .actionSheet)

// Add actions
actionSheet.addAction(UIAlertAction(title: "Edit",
                                    style: .default,
                                    handler: { (_: UIAlertAction) in
                                        self.showEditingView(withCommentId: commentId, withCommentText: commentText)
}))

// Present AlertController
if let lastApplicationWindow = UIApplication.shared.windows.last,
    let rootViewController = lastApplicationWindow.rootViewController {
    rootViewController.present(actionSheet, animated: true, completion: nil)
}

1
投票

对于那些寻找与 Corey 的答案等价的 Objective-C 的人:

UIViewController *objViewController = [UIApplication sharedApplication].windows.lastObject.rootViewController;
[objViewController presentViewController:view animated:YES completion:nil];

0
投票
let rootViewController = UIApplication.shared.windows.filter {$0.isKeyWindow}.first?.windowScene?.windows.last?.rootViewController
rootViewController?.present(createImagePickAlertController(vc: self, pickerController: pickerController), animated: false)

这个修复了“键盘无法呈现视图控制器(试图呈现 )”错误。

© www.soinside.com 2019 - 2024. All rights reserved.