# Usage ## Subclassing `ChatViewController` is meant to be subclassed, like you would normally do with UITableViewController. This pattern is a convenient way of extending UIViewController. `ChatViewController` manages a lot behind the scenes while still providing the ability to add custom behaviours. You may override methods, and decide to call super and perform additional logic, or not to call super and override default logic. Start by creating a new subclass of `ChatViewController`. Override delegate function of UITableView ```swift override func numberOfSections(in tableView: UITableView) -> Int { } override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { } override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { } ``` Override function `didPressSendButton` ```swift override func didPressSendButton(_ sender: Any?) { // Create message let message = Message(id: UUID().uuidString, text: chatBarView.textView.text) // Add message addMessage(message) // Call super to update UI for Chat Bar super.didPressSendButton(sender) } ``` Handle `ImagePickerView` call back ```swift /// Image Picker Result closure imagePickerView?.pickImageResult = { image, url, error in if error != nil { return } guard let _ = image, let _ = url else { return } print("Pick image successfully") } ``` ## Image Picker Currently, we support two style for ImagePicker. First one is Slack style and second one is action sheet style ### Slack style One or two rows depend on device and user turn on/off `predictive mode` for keyboard. To understand more clearly about how we implement it, see the [Image Picker](AdvancedUsage.md#image-picker) ### Action Sheet style Action Sheet is the simplest way to pick an image. To use default ImagePickerHelper to show `Action Sheet style`. Declare `imagePickerHelper` in YourViewController ```swift open lazy var imagePickerHelper: ImagePickerHelper = { let imagePickerHelper = ImagePickerHelper() imagePickerHelper.delegate = self imagePickerHelper.parentViewController = self return imagePickerHelper }() ``` Make YourViewController adopts ImagePickerHelperResultDelegate ```swift extension YourViewController: ImagePickerHelperResultDelegate { public func didFinishPickingMediaWithInfo(_ image: UIImage?, _ imagePath: URL?, _ error: Error?) { } } ``` Override `didPressGalleryButton` function ```swift override func didPressGalleryButton(_ sender: Any?) { /// Dismiss keyboard if keyboard is showing if currentKeyboardType == .default { dismissKeyboard() } imagePickerHelper?.takeOrChoosePhoto() } ``` ## Typing Indicator Create subclass `User` adopts `Userable` protocol ```swift struct User: Userable, Mappable { var id: Int! var name: String = "" var idNumber: String { get { return id.description } } var displayName: String { get { return name } } init(id: Int, name: String) { self.id = id self.name = name } } ``` Add an user who is typing ```swift user = User(id: 1, name: "Harry") typingIndicatorView.insertUser(user) ``` Remove an user who is typing ```swift user = User(id: 1, name: "Harry") typingIndicatorView.removeUser(user) ``` ## Chat Bar Visible Show Chat Bar ```swift setChatBarHidden(false, animated: true) ``` Hide Chat Bar ```swift setChatBarHidden(true, animated: true) ``` ## Pull To Refresh And Load More Add load more function ```swift // Add function load more for table view tableView.addLoadMore { in } ``` Add pull to refresh function ```swift // Add function refresh for table view tableView.addFooterRefresh { in } ```