2016-01-01 4 views
0

Я использую Swift 2.0 и у меня есть куча viewcontrollers с весьма схожей функциональностью:Обобщенная UITableViewDelegate и UITableViewDataSource

  • Каждый из них опирается на массив
  • Каждый элемент этого массива отображается в UITableViewCell
  • Существует удаление объекта функциональность для удаления UITableViewCell и объект
  • Существует новая пустая строка, чтобы добавить новый объект
  • Каждый из CONTROLL ERS определяет 5-6 методов, которые делают то же самое (только с другим массивом подложки)

Все они достаточно похожи для меня хотят создать обобщенный UITableViewDelegate и UITableViewDataSource, которые я могу создать экземпляр в каждом контроллере представления и передать только ViewController конкретную информацию, как

  • массив с данными
  • UITableViewCell идентификатор
  • т.д.

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

Однако самой большой проблемой для меня было умение передавать какой-то массив этому обобщенному, который может быть изменен внутри этого обобщенного класса (для удаления и вставки новых объектов).

Проблема заключается в быстром способе передачи массива (создание его копии). Я задал вопрос об этом Storing a reference to array in swift Тем не менее, я чувствую, что я не получил достаточной гибкости для его обобщения.

Кто-нибудь видел подход к решению этого обобщения? Есть идеи?

+0

Вы пытались использовать объект NSArray вместо массива-структуру Свифта? – Levi

ответ

1

Я бы создал суперкласс, который обладает всеми методами UITableViewDataSource и UITableViewDelegate, которые вам нужно реализовать. Тогда я бы сделал переопределяемые методы в суперклассе, которые вы переопределите в своих подклассах. Суперкласс вызывает эти методы, когда ему нужно получить данные и т. Д. Из методов делегата.

Пример методов, которые подкласс перекрывает от суперкласса.

// Backing array class 
class MyObject {} 


// Base Controller 
class BaseController: UIViewController { 

    // Overrideable methods for subclasses providing data. 
    func backingArray() -> [MyObject] { 
     return [MyObject]() 
    } 

    func cellId() -> String { 
     return "" 
    } 
} 

extension BaseController: UITableViewDelegate { 
    // Use the methods in the same way used in the example in the data source extension. 
} 

extension BaseController : UITableViewDataSource { 

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     // Use data from the backingArray() here. 

     return UITableViewCell() 
    } 

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return backingArray().count 
    } 
} 


// Sub classes 
class FirstSubController : BaseController { 

    override func backingArray() -> [MyObject] { 
     return [MyObject]() 
    } 

    override func cellId() -> String { 
     return "AnotherCellId" 
    } 
} 
0

Почему вы не создать сам ViewController, который следует UITableViewDelegate и UITableViewDataSource протоколы?

Просто создать класс

class UVC : UIViewController, UITableViewDelegate, UITableViewDataSource { 
    var arr : [MyObject] = [] 
    var tableView! 

    func deleteRow(i : Int){ 
     arr.removeAtIndex(i) 
     tableView.reloadData() 
    } 

    func addRow(i : Int, obj : MyObject){ 
     arr.insert(obj, atIndex: i) 
     tableView.reloadData() 
    }   

    override func viewDidAppear(){ 
     // Initialize tableView. 
    } 


    ..cellForRowAtIndexPath... { 
     cell.text = arr[indexPath.row] 
    } 

    ..numberOfRowsInSection... { 
     return arr.count 
    } 

    ... Other Regular functions for Both Delegates/Source 
}