Возникли проблемы, избегая подклассов - PullRequest
0 голосов
/ 24 сентября 2018

У меня есть приложение с несколькими контроллерами представления.Я реализую панель поиска для навигации по табличному представлению , которое находится в каждом из этих контроллеров представления.

Я решил реализовать контроллер поиска с помощью пользовательского класса, где я обрабатываю всю логику поиска.Чтобы сделать это возможным, я в настоящее время использую суперкласс, от которого наследуется каждый контроллер представления.Я хотел бы знать, есть ли для меня способ сделать эту работу без подклассов.

Вот текущая реализация моего SearchController класса:

class SearchController: NSObject, UISearchBarDelegate {

    /* This is the trouble spot. If I change this to UIViewController?, 
       I get the compiler error "value of type UIViewController has no member tableView" */
    weak var viewController: BaseViewController?  

    /*
      ... rest of SearchController implementation

      includes methods that interact with view controller table views
    */
}

это класс BaseViewController:

class BaseViewController: UIViewController {

    let searchController = SearchController()
    let tableView = UITableView(activityIndicatorStyle: UIActivityIndicatorViewStyle.gray)

    /*
      ... rest of BaseViewController implementation
    */

}

Подводя итог, у меня возникает проблема в том, что у меня есть несколько контроллеров представления с табличными представлениями, и я не могу заставить эту работу работать без создания новогобазовый класс, от которого они могут наследовать.Использование UIViewController просто не будет работать, потому что класс UIViewController не имеет встроенного свойства tableView.

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

Вам не нужно заставлять все ваши viewController подклассы BaseViewController.Если единственное требование для viewController - иметь свойство tableView, тогда определите протокол с этим требованием и заставьте соответствующие viewControllers реализовать этот протокол.Переписав свой пример:

protocol BaseControllerProtocol: class {
    var tableview: UITableView { get }
}

class SearchController: NSObject, UISearchBarDelegate {

    //We store any class that implements the BaseControllerProtocol protocol
    //Now you can use viewController.tableview
    weak var viewController: BaseControllerProtocol?
    //If you what to have UIViewcontrollers instances only use:
    //weak var viewController: (UIViewController & BaseControllerProtocol)?
}

//An example of a viewcontroller that implements the BaseControllerProtocol
class ARandomViewController : UIViewController, BaseControllerProtocol {
    var tableview: UITableView = UITableView()
}
0 голосов
/ 24 сентября 2018

Я думаю, что вы все еще могли бы использовать UIViewController?, если бы вы присвоили его UITableView частной tableView вычисляемой переменной экземпляра вашего SearchViewController, например:

class SearchController: NSObject, UISearchBarDelegate {
    weak var viewController: UIViewController?

    fileprivate var _tableView: UITableView? {
        if let vc = self.viewController {
            for subview in vc.view.subviews {
                if let tableView = subview as? UITableView {
                    return tableView
                }
            }
        }
        return nil
    }

    // Whatever methods interact with table view should now use self._tableView.
    func doSomething() {
        guard let tableView = self._tableView else { return }
        // Do something with the tableView
    }
}
...