# BaseChatViewController The base UIViewController you must subclass Needs an input bar: ```swift public func createChatInputView() -> UIView { assert(false, "Override in subclass") return UIView() } ``` Needs a [Data source]: ```swift public final func setChatDataSource(dataSource: ChatDataSourceProtocol?, triggeringUpdateType updateType: UpdateType?) { ... } ``` Needs to know how to create [[Presenters]] for your `ChatItem`s: ```swift public func createPresenterFactory() -> ChatItemPresenterFactoryProtocol { // Default implementation return ChatItemPresenterFactory(presenterBuildersByType: self.createPresenterBuilders()) } ``` If you stick to the default implementation then you must override `createPresenterBuilders` ```swift public typealias ChatItemType = String public func createPresenterBuilders() -> [ChatItemType: [ChatItemPresenterBuilderProtocol]] { assert(false, "Override in subclass") return [ChatItemType: [ChatItemPresenterBuilderProtocol]]() } ```