简体   繁体   English

InputAccessoryView未显示 - Swift 3 Xcode 8.3 beta(非storyBoard)

[英]InputAccessoryView Not showing - Swift 3 Xcode 8.3 beta (Non storyBoard)

I have a message view controller that has an InputAccessoryView. 我有一个具有InputAccessoryView的消息视图控制器。 The problem I have is when I pass (user data) to the message controller from my first view controller the InputAccessoryView does not show. 我遇到的问题是当我从第一个视图控制器传递(用户数据)到消息控制器时,InputAccessoryView没有显示。 Now, when I pass the (user data) to the message controller from the message list controller the InputAccessoryView shows. 现在,当我从消息列表控制器将(用户数据)传递给消息控制器时,InputAccessoryView显示。

Here is the message controller: 这是消息控制器:

class MessageViewController: UICollectionViewController, UITextFieldDelegate, UICollectionViewDelegateFlowLayout, UIImagePickerControllerDelegate, UINavigationControllerDelegate {    
var user: User? {
    didSet {
        navigationItem.title = user?.first_name
    }
}

override func viewDidLoad() {
    super.viewDidLoad()
    collectionView?.keyboardDismissMode = .interactive
    setupKeyboardObservers()
}

lazy var inputContainerView: ChatInputContainerView = {
    let chatInputContainerView = ChatInputContainerView(frame: CGRect(x: 0, y: 0, width: self.view.frame.width, height: 50))
    chatInputContainerView.newMessageViewController = self
    return chatInputContainerView
}()

override var inputAccessoryView: UIView? {
    get {
        return inputContainerView
    }
}

override var canBecomeFirstResponder : Bool {
    return true
}

func setupKeyboardObservers() {
    NotificationCenter.default.addObserver(self, selector: #selector(handleKeyboardDidShow), name: NSNotification.Name.UIKeyboardDidShow, object: nil)
}

func handleKeyboardDidShow() {
    if messages.count > 0 {
        let indexPath = IndexPath(item: messages.count - 1, section: 0)
        collectionView?.scrollToItem(at: indexPath, at: .top, animated: true)
    }
}

override func viewDidDisappear(_ animated: Bool) {
    super.viewDidDisappear(animated)
    NotificationCenter.default.removeObserver(self)
}
}

And the message list controller: 和消息列表控制器:

class MessageViewController: UITableViewController {
    let user = User()
    let newMessageViewController =  NewMessageViewController(collectionViewLayout: UICollectionViewFlowLayout())
    //Send user data to (newMessageViewController) and show  newMessageViewController view controller
    newMessageViewController.user = user
    newMessageViewController.hidesBottomBarWhenPushed = true          
    self.navigationController?.pushViewController(MessageViewController, animated: true)
}

Now, this works fine! 现在,这很好用! Here is where the problem starts. 这是问题的起点。 The first view controller has a subview that sends (user data) via delagate to the superview. 第一个视图控制器有一个子视图,通过delagate将(用户数据)发送到superview。

delegate?.sendBackToDrag(passBackFromBlur: user)

Then, the sendBackToDrag method presents blurPopOver view controller. 然后,sendBackToDrag方法呈现blurPopOver视图控制器。

func sendBackToDrag(passBackFromBlur: User) {
    let blurPopOver = BlurPopOver()
    blurPopOver.user = passBackFromBlur as User
    blurPopOver.delegate = self
    blurPopOver.modalPresentationStyle = .overFullScreen
    present(blurPopOver, animated: false, completion: nil)
}

After the blurPopOver is presented, it sends (user data) back to the first view controller. 在呈现blurPopOver之后,它将(用户数据)发送回第一个视图控制器。

delegate?.sendBackToFind(passBackToFind: user)

When data is passed back via delegate, display message view controller. 当数据通过委托传回时,显示消息视图控制器。

func sendBackToFind(passBackToFind: User) {
    let newMessageViewController = NewMessageViewController(collectionViewLayout: UICollectionViewFlowLayout())
    newMessageViewController.user = passBackToFind
    newMessageViewController.hidesBottomBarWhenPushed = true
    self.navigationController?.pushViewController(MessageViewController, animated: true)
}

Here are the protocols: 以下是协议:

protocol MessageDelegateDrag {
    func sendBackToDrag(passBackFromBlur: User)
}

protocol MessageDelegateFind {
    func sendBackToFind(passBackToFind: User)
}

在此输入图像描述

Now, it works when I pass the (user data) in like this: 现在,当我像这样传递(用户数据)时,它可以工作:

    func sendBackToFind(passBackToFind: User) {
    let user = User()
    user.id = "user_id"
    user.first_name = "user_first_name"
    user.last_name = "user_last_name"
    user.profile_image = "user_image_url"

    let newMessageViewController = NewMessageViewController(collectionViewLayout: UICollectionViewFlowLayout())
    newMessageViewController.user = user
    newMessageViewController.hidesBottomBarWhenPushed = true
    self.navigationController?.pushViewController(MessageViewController, animated: true)
}

It seems by adding the data as a constant in the sendBackToFind method works fine. 似乎通过在sendBackToFind方法中添加数据作为常量工作正常。

I found a solution. 我找到了解决方案。 I ended up adding a subview to 1st view controller and push message controller from the subview. 我最终将子视图添加到第一个视图控制器并从子视图中推送消息控制器。 Completely removing the popover controller. 完全删除弹出控制器。 I am not sure if this is the best solution, but it works! 我不确定这是否是最佳解决方案,但它确实有效!

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM