2017-01-29 7 views
1

У меня есть контроллер представления сообщений, который имеет InputAccessoryView. Проблема заключается в том, что когда я передаю (данные пользователя) в контроллер сообщений с моего первого контроллера представления, InputAccessoryView не показывает. Теперь, когда я передаю (данные пользователя) контроллеру сообщений из контроллера списка сообщений, отображает InputAccessoryView.InputAccessoryView Не отображается - Swift 3 Xcode 8.3 beta (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) 
} 

Теперь, это работает отлично! Здесь проблема начинается. Первый контроллер представления имеет подчиненный объект, который отправляет (данные пользователя) через 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

Я нашел решение. Я закончил тем, что добавил subview в контроллер 1-го вида и вытолкнул контроллер сообщений из подвью. Полностью удалить контроллер popover. Я не уверен, что это лучшее решение, но оно работает!