首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UIInputViewController在离开并返回查看控制器后被解雇

UIInputViewController在离开并返回查看控制器后被解雇
EN

Stack Overflow用户
提问于 2017-07-28 18:59:24
回答 2查看 1.1K关注 0票数 3

我正在尝试创建一个自定义聊天工具栏,以显示带有消息的文本视图,以及允许图片选择的按钮。今天早上,我重新编写了代码,以便非常密切地跟踪这是WWDC 2017关于文本输入的讨论。工具栏本身是一个UIInputViewController,它使用自定义视图来定义它的inputView。当我选择一个按钮时,我会显示一个UIImagePickerController,它工作得很好。当我选择一个图像并返回到对话屏幕时,问题就会发生.此时,当我再次与工具栏交互时,它会在触摸时消失。下面是移除屏幕前的堆栈跟踪:

代码语言:javascript
复制
#0  0x000000010d3b91fa in ConvoViewController.textViewDidEndEditing(UITextView) -> () at /Users/Joel/Documents/Software Projects/AtMe/AtMe/ConvoViewController.swift:480
#1  0x000000010d3b93ca in @objc ConvoViewController.textViewDidEndEditing(UITextView) -> () ()
#2  0x000000010f4b88b8 in -[UITextView resignFirstResponder] ()
#3  0x000000010ea9cc74 in -[UIView(Hierarchy) _removeFirstResponderFromSubtree] ()
#4  0x000000010ea9d2eb in __UIViewWillBeRemovedFromSuperview ()
#5  0x000000010ea9d09e in -[UIView(Hierarchy) removeFromSuperview] ()
#6  0x000000010f45cf5c in __55-[UIInputWindowController invalidateInputAccessoryView]_block_invoke ()
#7  0x000000010ec069a5 in -[UIResponder _preserveResponderOverridesWhilePerforming:] ()
#8  0x000000010f45ced4 in -[UIInputWindowController invalidateInputAccessoryView] ()
#9  0x000000010f45d889 in -[UIInputWindowController changeToInputViewSet:] ()
#10 0x000000010f456675 in -[UIInputWindowController moveFromPlacement:toPlacement:starting:completion:] ()
#11 0x000000010f45e82f in -[UIInputWindowController setInputViewSet:] ()
#12 0x000000010f45614c in -[UIInputWindowController performOperations:withAnimationStyle:] ()
#13 0x000000010f0cca8a in -[UIPeripheralHost(UIKitInternal) setInputViews:animationStyle:] ()
#14 0x000000010ec0962d in -[UIResponder(UIResponderInputViewAdditions) reloadInputViews] ()
#15 0x000000010ec07ef1 in -[UIResponder _windowBecameKey] ()
#16 0x000000010ea6e9bb in -[UIWindow _makeKeyWindowIgnoringOldKeyWindow:] ()
#17 0x000000010ef33ab4 in -[UITextInteractionAssistant(UITextInteractionAssistant_Internal) setFirstResponderIfNecessary] ()
#18 0x000000010ef37178 in -[UITextInteractionAssistant(UITextInteractionAssistant_Internal) oneFingerTap:] ()
#19 0x000000010ef24f59 in -[UIGestureRecognizerTarget _sendActionWithGestureRecognizer:] ()
#20 0x000000010ef2cd57 in _UIGestureRecognizerSendTargetActions ()
#21 0x000000010ef2a70b in _UIGestureRecognizerSendActions ()
#22 0x000000010ef299ce in -[UIGestureRecognizer _updateGestureWithEvent:buttonEvent:] ()
#23 0x000000010ef16152 in _UIGestureEnvironmentUpdate ()
#24 0x000000010ef15c43 in -[UIGestureEnvironment _deliverEvent:toGestureRecognizers:usingBlock:] ()
#25 0x000000010ef14e0a in -[UIGestureEnvironment _updateGesturesForEvent:window:] ()
#26 0x000000010ea60eea in -[UIWindow sendEvent:] ()
#27 0x000000010ea0da84 in -[UIApplication sendEvent:] ()
#28 0x000000010f1f15d4 in __dispatchPreprocessedEventFromEventQueue ()
#29 0x000000010f1e9532 in __handleEventQueue ()
#30 0x0000000110d14c01 in __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ ()
#31 0x0000000110cfa0cf in __CFRunLoopDoSources0 ()
#32 0x0000000110cf95ff in __CFRunLoopRun ()
#33 0x0000000110cf9016 in CFRunLoopRunSpecific ()
#34 0x00000001135fba24 in GSEventRunModal ()
#35 0x000000010e9f0134 in UIApplicationMain ()
#36 0x000000010d3ebed7 in main at /Users/Joel/Documents/Software Projects/AtMe/AtMe/AppDelegate.swift:15
#37 0x000000011258065d in start ()
#38 0x000000011258065d in start ()

我觉得UIInputViewController在某种程度上是无效的,但我不知道如何测试它。有人有什么想法吗?我花了好几天的时间让这个工具栏没有bug,不管你怎么处理它,似乎都是不可能的。

conversationViewController.swift

代码语言:javascript
复制
// MARK: - Input Accessory View (Controller)
fileprivate let chatToolbarView: ChatToolbarView = {
    let view = ChatToolbarView(frame: CGRect.zero, inputViewStyle: UIInputViewStyle.default)

    // Add selectors as targets to the toolbar buttons
    view.sendButton.addTarget(self, action: #selector(didPressSend(sender:)), for: UIControlEvents.touchUpInside)
    view.libraryButton.addTarget(self, action: #selector(didPressLibraryIcon(sender:)), for: UIControlEvents.touchUpInside)
    view.cameraButton.addTarget(self, action: #selector(didPressCameraIcon(sender:)), for: UIControlEvents.touchUpInside)

    return view
}()

// Wrapper view controller for the custom input accessory view
fileprivate let chatToolbarViewController = UIInputViewController()

override var inputAccessoryViewController: UIInputViewController? {
    // Ensure our input accessory view controller has it's input view set
    chatToolbarViewController.inputView = chatToolbarView

    // Return our custom input accessory view controller. You could also just return a UIView with
    // override func inputAccessoryView()
    return chatToolbarViewController
}


/** Action method which fires when the user taps the camera icon. */
@objc func didPressCameraIcon(sender: Any) {

    photoPickerDisplayed = true

    // Create picker, and set this controller as delegate
    let picker = UIImagePickerController()
    picker.delegate = self
    picker.allowsEditing = true
    picker.sourceType = UIImagePickerControllerSourceType.camera

    DispatchQueue.main.async {
        self.present(picker, animated: true, completion: nil)
    }
}

override var canBecomeFirstResponder: Bool { return true }
EN

回答 2

Stack Overflow用户

发布于 2017-08-01 16:28:08

我最终解决了这个问题,将我的自定义工具栏视图分配给视图控制器的inputAccessoryView,,而不是将它分配给视图控制器的inputAccessoryViewController的inputView属性。

最大的问题是,在原始代码中,任何视图控制器都可以正常地呈现(例如。( UIImagePickerViewController)混淆了inputAccessoryViewController,当返回到原始控制器时将被完全驳回。无论如何,使用控制器似乎是不必要的,它更适合直接定制键盘,而不是配件。

代码现在如下所示:

代码语言:javascript
复制
fileprivate let chatToolbarView: ChatToolbarView = {
    let view = ChatToolbarView(frame: CGRect.zero, inputViewStyle: UIInputViewStyle.default)

    // Add selectors as targets to the toolbar buttons
    view.sendButton.addTarget(self, action: #selector(didPressSend(sender:)), for: UIControlEvents.touchUpInside)
    view.libraryButton.addTarget(self, action: #selector(didPressLibraryIcon(sender:)), for: UIControlEvents.touchUpInside)
    view.cameraButton.addTarget(self, action: #selector(didPressCameraIcon(sender:)), for: UIControlEvents.touchUpInside)

    return view
}()


/** Provide the view controller's inputAccessoryView object. */
override var inputAccessoryView: UIView? { return chatToolbarView }


/** Give the view controller permission to become first responder. */
override var canBecomeFirstResponder: Bool { return true }
票数 1
EN

Stack Overflow用户

发布于 2017-07-28 19:02:00

在你viewDidAppear上

代码语言:javascript
复制
yourTextView.becomeFirstResponder()

这将触发您的自定义inputView再次打开。

希望这能有所帮助!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45380607

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档