2016-09-26 21 views
16

Po migracji do Swift 3 Mam następujący sposób:Swift 3 UITableView metoda DataSource viewForHeaderInSection daje ostrzeżenie

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {} 

I to daje mi ostrzeżenie

Metoda Instance „tableView (tableView: viewForHeaderInSection:) "prawie spełnia wymagania opcjonalne" tableView (_: titleForHeaderInSection :) " protokołu" UITableViewDataSource "

Napraw - oferuje opcję uczynienia tej metody prywatną lub dodania adnotacji "nonobjc". Jak rozwiązać ostrzeżenie?

+0

Występuje również w tym problemie. Naprawiono również sugerowanie, że zaznaczam je jako prywatne, aby uciszyć ostrzeżenie. – Mike

+2

nie można tego zrobić, w przeciwnym razie ta metoda nie zostanie nazwana – Jacky

Odpowiedz

23

Miałem podobne ostrzeżenia na całej mojej aplikacji. W rzeczywistości były 2 problemy. Naprawiłem wszystkie ostrzeżenia, dodając podkreślenie do podpisu metody lub przesuwając metodę do właściwego rozszerzenia, które implementuje protokół, z którego pochodzi ta metoda.

Myślę, że twój problem może być połączeniem obu.

Bardziej szczegółowo:

1) Możecie zapomnieć dodać znak „podkreślenia” przed „Tableview: ...”, co sprawia, że ​​inna metoda w Swift 3 (w Swift 2.3 nie ma znaczenia). Należy więc zmienić:

func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? 

do tego:

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? 

2) Metoda tableView(_:viewForHeaderInSection:) jest z protokołem UITableViewDelegate, ale wygląda na to, że kompilator nie wie o tej metodzie, to tylko wie metod z UITableViewDataSource i próbuje doradzić jedną z nich (tableView(_:titleForHeaderInSection:)). Więc albo nie zaimplementujesz w ogóle UITableViewDelegate, ale może w innym rozszerzeniu?

+7

W rzeczywistości przyczyną problemu jest to, że metoda została dodana do rozszerzenia źródła danych zamiast do delegata. Dziękuję za wskazanie tego. –

+0

To samo dla mnie po prostu dodano 'UITableViewDelegate' –

+1

2) Wskazówka sprawiła, że ​​działa dla mnie. Zadziwiające, ile różnych "sztuczek" wycisza ostrzeżenie, które przeczytałem ... Przestawienie metod w jedno rozszerzenie na zgodność z UITableViewDataSource i innymi na rozszerzenie na zgodność z UITableViewDelegate naprawiło to, a nawet sprawiło, że dekoracja @obj() stała się przestarzała. Dzięki. –