2017-01-29 13 views
1

私はInputAccessoryViewを持つメッセージビューコントローラを持っています。私が持っている問題は、InputAccessoryViewが表示していない最初のView Controllerから(ユーザーデータ)をメッセージコントローラに渡すときです。今、(ユーザーデータ)をメッセージコントローラにメッセージリストコントローラから渡すと、InputAccessoryViewが表示されます。ここでInputAccessoryViewが表示されません - Swift 3 Xcode 8.3ベータ版(Non storyboard)

がメッセージコントローラです:

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) 
} 
} 

とメッセージリストコントローラ:今すぐ

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) 
} 

、これは正常に動作します!ここで問題が始まるところです。 最初のView Controllerには、delagate経由で(ユーザーデータ)をスーパービューに送信するサブビューがあります。

delegate?.sendBackToDrag(passBackFromBlur: user) 

次に、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) 
} 

blurPopOverが提示されると、(ユーザーデータ)が最初のビューコントローラーに返されます。

delegate?.sendBackToFind(passBackToFind: user) 

データがデリゲートを介して返されると、メッセージビューコントローラが表示されます。ここで

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

はプロトコルです:

protocol MessageDelegateDrag { 
    func sendBackToDrag(passBackFromBlur: User) 
} 

protocol MessageDelegateFind { 
    func sendBackToFind(passBackToFind: User) 
} 

enter image description here

私はこのように(ユーザデータ)を通過したときに今、それが動作:

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) 
} 

それはでそうですsendBackToFindメソッドでデータを定数として追加すると問題なく動作します。

答えて

0

解決策が見つかりました。私は最初のビューコントローラにサブビューを追加し、サブビューからメッセージコントローラをプッシュすることになりました。 popoverコントローラを完全に削除します。これが最善の解決策であるかどうかはわかりませんが、うまくいきます!

関連する問題