2017-02-02 3 views
1

Я пытаюсь создать VC с родового типа, как это:Swift 3 ViewController с типом дженериков и UITableView

class SearchViewController<T>: UIViewControlle { 
    @IBOutlet weak var tableView: UITableView! 
    var delegate: SearchViewControllerDelegate? 
    fileprivate var dataArray: [T] = [] 

... 
} 

extension SearchViewController: UITableViewDelegate, UITableViewDataSource { 
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return showAddRow ? 1 : dataArray.count 

    } 
} 

Но я получаю эту ошибку:

Non - '@ ObjC' метод 'Tableview (_: numberOfRowsInSection :) не удовлетворить требование '@objc' протокол 'UITableViewDataSource'

Я попытался к @objc method, как это:

@objc(tableView:numberOfRowsInSection:) 

, но это не сработало. Что я пропустил?

ответ

0

Вы должны объявить все протокол Tableview ..

func tableView(_ tableView:UITableView, numberOfRowsInSection section:Int) -> Int 
{ 
    return 1 
} 
private func numberOfSectionsInTableView(tableView: UITableView) -> Int 
{ 
    return 1 
} 
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
{ 

    return cell 
} 

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
{ 

} 
0

, если вы посмотрите на протокол UITableViewDataSource в Swift: вы заметите, что

public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 

не является необязательным метод, так что вы должны объявите его, чтобы ваш код работал! (То же самое с UITableViewDelegate)

public protocol UITableViewDataSource : NSObjectProtocol { 


    @available(iOS 2.0, *) 
    public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 


    // Row display. Implementers should *always* try to reuse cells by setting each cell's reuseIdentifier and querying for available reusable cells with dequeueReusableCellWithIdentifier: 
    // Cell gets various attributes set automatically based on table (separators) and data source (accessory views, editing controls) 

    @available(iOS 2.0, *) 
    public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 


    @available(iOS 2.0, *) 
    optional public func numberOfSections(in tableView: UITableView) -> Int // Default is 1 if not implemented 


    @available(iOS 2.0, *) 
    optional public func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? // fixed font style. use custom view (UILabel) if you want something different 

    @available(iOS 2.0, *) 
    optional public func tableView(_ tableView: UITableView, titleForFooterInSection section: Int) -> String? 


    // Editing 

    // Individual rows can opt out of having the -editing property set for them. If not implemented, all rows are assumed to be editable. 
    @available(iOS 2.0, *) 
    optional public func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool 


    // Moving/reordering 

    // Allows the reorder accessory view to optionally be shown for a particular row. By default, the reorder control will be shown only if the datasource implements -tableView:moveRowAtIndexPath:toIndexPath: 
    @available(iOS 2.0, *) 
    optional public func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool 


    // Index 

    @available(iOS 2.0, *) 
    optional public func sectionIndexTitles(for tableView: UITableView) -> [String]? // return list of section titles to display in section index view (e.g. "ABCD...Z#") 

    @available(iOS 2.0, *) 
    optional public func tableView(_ tableView: UITableView, sectionForSectionIndexTitle title: String, at index: Int) -> Int // tell table which section corresponds to section title/index (e.g. "B",1)) 


    // Data manipulation - insert and delete support 

    // After a row has the minus or plus button invoked (based on the UITableViewCellEditingStyle for the cell), the dataSource must commit the change 
    // Not called for edit actions using UITableViewRowAction - the action's handler will be invoked instead 
    @available(iOS 2.0, *) 
    optional public func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) 


    // Data manipulation - reorder/moving support 

    @available(iOS 2.0, *) 
    optional public func tableView(_ tableView: UITableView, moveRowAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) 
} 
Смежные вопросы