    // MARK: - Private
    @objc private func _refreshControlChanged(control: UIRefreshControl) {
       formDelegate?.elementsBeganRefreshing(in: self)
+   }
+   
+   private func _removeFooterView() {
+      _update(footerView: _emptyFooterView)
+   }
+   
+   private func _update(footerView: UIView) {
+      _footerContainerView.subviews.forEach { $0.removeFromSuperview() }
+      
+      _footerContainerView.addSubview(footerView)
+      
+      NSLayoutConstraint.activate([
+         footerView.centerXAnchor.constraint(equalTo: _footerContainerView.centerXAnchor),
+         footerView.centerYAnchor.constraint(equalTo: _footerContainerView.centerYAnchor),
+         _footerContainerView.heightAnchor.constraint(equalTo: footerView.heightAnchor),
+         ])
    }
 }
 

   
      return cv
   }()

   fileprivate var _animatingIndexPaths: [IndexPath]?
   fileprivate var _needsReload: Bool = false
   fileprivate var _needsLayout: Bool = false

   fileprivate var _elements: [Elemental] = []
   
   // MARK: - Public Properties
   public var footerView: UIView? {
      didSet {
         switch footerView {
         case .none: _removeFooterView()
         case .some(let view): _update(footerView: view)
         }
      }
   }
   
   public var elements: [Elemental] {
      get { return _elements }
