2013-08-21 2 views
1

На мой взгляд, я использовал UITableView, я установил делегат и источник данных с владельцем файла в nib. И в моем файле .h класса я Соответствует протокол, как показано ниже ...Как работают делегаты UITableView?

например:

@interface test : UIViewController<UITableViewDelegate, UITableViewDataSource> 
{ 
... 
... 
} 

Все отлично работает ... делегат метода все правильно называется ... Теперь мой вопрос почему мы добавляем «UITableViewDelegate, UITableViewDataSource» в .h. без этого я получаю эти звонки. Какая польза от этого?

Thanx

+0

добавление чего? протоколов (UITableViewDelegate, UITableViewDataSource)? – Injectios

+0

Да. Проверьте, что прямоугольные скобки разрезали эту строку ... – Newbee

+5

Это означает, что класс поддерживает эти методы из UITableViewDelegate. И, фактически, не добавляя их, вы не можете начинать вводить такие методы, как -tableView: numberInRows и т. Д. С автозавершением. – Injectios

ответ

5

По двум причинам я думаю:

  1. Это для компилятора, чтобы сказать, что вы будете выполнять DataSource и делегировать методы и компилятор предупреждает, если вы не выполнять их.

  2. автозаполнения по этим методам работы, только если добавить, что, как в заголовочных файлах

1

Если вы хотите создать или использовать UITableView программно вместо nib файла, то вам необходимо указать <UITableViewDelegate, UITableViewDataSource> в .h файле.

И если вы хотите использовать UITableView в .nib-файле, а не программно, чем вам не нужно указывать его в файле .h.

+0

Я не понимаю этот момент. Если вы создаете UITableView программно, и вы не укажете декальвацию в заголовочном файле, как это, вы обязаны получить ошибку компиляции/времени выполнения? –

+0

@Puneet - при создании UITableView программно, вы должны указать декальвацию в заголовочном файле, подобном этому – Rohan

+0

В противном случае это приведет к ошибке? Ты уверен в этом? –

2

Если в вашем .xib-файле вы устанавливаете свой источник данных и делегируете владельцу файла, я думаю, что нет необходимости это делать.

+1

Сарфарас, я думаю, вы ошибаетесь. Настройка через Interface Builder заменяет 'tableView.delegate = self;' и 'tableView.dataSource = self;'. Как говорит Пунеет, это должно быть для интерфейсов компилятора, автозаполнения и классов. –

1
See this url for reference.. 

https://developer.apple.com/library/ios/documentation/uikit/reference/UITableViewDelegate_Protocol/Reference/Reference.html 

Also In this url we will use the methods frequently are 

– tableView:heightForRowAtIndexPath: 

    This will set Height 

– tableView:didDeselectRowAtIndexPath: 

This will act as cellback for ui actions you are doing in table 

– tableView:viewForHeaderInSection: 

usually we will add uiviews as table header 

– tableView:viewForFooterInSection: 

usually we will add uiviews as table footer 

– tableView:heightForHeaderInSection 

will set height to section header 

– tableView:heightForFooterInSection 

will set height to section footer 
+1

Это то, что сделает делегат – NHS

2

Яблоко определяет Protocols как:

В мире объектно-ориентированного программирования, это важно, чтобы иметь возможность определить набор поведения, который ожидается от объекта в заданной ситуации. В качестве примера, представление таблицы ожидает, что сможет связываться с объектом источника данных, чтобы узнать, что это такое , которое требуется для отображения. Это означает, что источник данных должен отвечать на определенный набор сообщений, которые может отправлять табличное представление.

Objective-C позволяет определить протоколы, объявляющие методы , которые, как ожидается, будут использоваться для конкретной ситуации.

Чтобы узнать больше о Справочнике по протоколу Tableview, вы посмотрите на может:

  1. UITableViewDataSource Protocol Reference
  2. UITableViewDelegate Protocol Reference
2

если вы пишете <UITableViewDelegate, UITableViewDataSource> это просто означает, что ваш класс conformsToProtocol к UITableViewDelegate и UITableViewDataSource

Вы можете Alloc в test (ваш тестовый класс) и вызывать этот

[testObject conformsToProtocol:@protocol(UITableViewDelegate)]; 

вернет true.

еще

вернет false. BTW, если вы не напишете метод tableviewDelegate, он не будет автозаполнен для вас

Вы спрашиваете, почему мы добавляем «UITableViewDelegate, UITableViewDataSource» в .h. без этого я получаю эти звонки.

т.к., поэтому.

if ([delegate respondsToSelector:@selector(cellWillDisplay...)]) 
{ 
     [delegate cellWillDisplay...]; //Apple gives you call 
} 

YEAH, ваш класс реализовать метод cellWillDisplay... тогда вы получите вызов!

Смежные вопросы