Как передать значения в @protocol - PullRequest
2 голосов
/ 20 июля 2011

Я пытаюсь реализовать протокол.

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

Я пытаюсь составить представлениечто пользователь нажимает на имя файла в табличном представлении, вызывая 'didSelectRowAtIndexPath', который, в свою очередь, уведомляет делегата о том, что пользователь выбрал файл (вызывая didSelectFileName в делегате) и передавая fileName.Я объявил протокол следующим образом:

@protocol FileList <NSObject>
- (void)didSelectFileName:(NSString *)fileName;    
@end

Мои вопросы:

  • Как установить значение fileName, чтобы при вызове didSelectFileName оно имелотекущее значение в нем
  • Как мне сказать, чтобы мой код вызывал 'didSelectFileName' в делегате.

Ответы [ 2 ]

3 голосов
/ 20 июля 2011

Вы не можете просто отправить сообщение в протокол (или установить значения). Вы отправляете сообщение классу, соответствующему протоколу.


Когда вы говорите, что класс соответствует протоколу (@interface MyClass : NSObject <MyProtocol> { etc), вы можете безопасно отправлять в класс любые сообщения с помощью селекторов, соответствующих методам в протоколе.

Итак, если мы возьмем ваш протокол, например, у нас может быть класс, который может отправлять сообщения делегату:

@interface MyClass : NSObject {
  id<FileList> _delegate;
}

@end

@implementation MyClass

- someMethod {
  NSString *fn = @"Hello.";
  [_delegate didSelectFileName:fn];
}

@end

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

Вам не нужно переопределять методы в интерфейсе вашего класса делегата.


Вот несколько хороших статей о протоколах:

1 голос
/ 20 июля 2011

// В табличном представлении метод

- (void)tableView didSelectRowAtIndexPath....... {
UITableViewCell *cell = [tableView methodToGetCell];
if(delegate && [delegate respondsToSelector:@selector(didSelectFileName:)]){
[delegate didSelectFileName:cell.text];
}
...