私は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)
}
私はこのように(ユーザデータ)を通過したときに今、それが動作:
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メソッドでデータを定数として追加すると問題なく動作します。