использование протокола и делегата для передачи данных между представлениями - PullRequest
0 голосов
/ 27 сентября 2011

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

Однако у меня есть одно предупреждениеэто появляется, когда я пытаюсь сказать своему подпредставлению, что mainview - это его делегат.отправляет обратно это предупреждение

"+ setDelegate: 'не найдено (тип возвращаемого значения по умолчанию равен' id ')"

До этого момента все было в порядке, и яЯ просто размышляю над тем, что означает эта ошибка, и если это как-то связано с тем, как я реализовал свой код.

ниже, где происходит предупреждение ...

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Navigation logic may go here. Create and push another view controller.
    //--- Idendify selected indexPath (section/row)
    if (indexPath.section == 0) {
        //--- Get the subview ready for use
        VehicleResultViewController *vehicleResultViewController = [[VehicleResultViewController alloc] initWithNibName:@"VehicleResultViewController" bundle:nil];
        // ...
        //--- Sets the back button for the new view that loads
        self.navigationItem.backBarButtonItem = [[[UIBarButtonItem alloc] initWithTitle:@"Back" style: UIBarButtonItemStyleBordered target:nil action:nil] autorelease];

        // Pass the selected object to the new view controller.
        [self.navigationController pushViewController:vehicleResultViewController animated:YES];

        [VehicleResultViewController setDelegate:self]; //<<-- warning here says -->> Method'+setDelegate:' not found (return type defaults to 'id')

        switch (indexPath.row)
        {
                case 0: vehicleResultViewController.title = @"Manufacture";
                [vehicleResultViewController setRequestString:@"manufacture.php"]; //sets the request string in searchResultsViewController
                break;
//...

Любая помощьбудет принята с благодарностью.

Обновлено, вот как я настроил моего делегата: SecondView.h

//...
@interface VehicleResultViewController : UITableViewController <NSXMLParserDelegate> {
//..
    id <PassSearchData> delegate;
}
//..
@property (retain) id delegate;

@end

SecondView.m

//..
@synthesize delegate;
//..
- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
    [[self delegate] setVehicleSearchFields:vehicleCellTextLabel];
}
//..

Надеюсь, это лучше проясняет, что я делаю.

Ответы [ 2 ]

3 голосов
/ 27 сентября 2011

Вы вызываете метод экземпляра для класса.

Эта строка:

[VehicleResultViewController setDelegate:self];

должна быть:

[vehicleResultViewController setDelegate:self];

Первая строка вызывает setDelegate для VehicleResultViewController, который является названием класса.Поскольку setDelegate не является методом класса, компилятор жалуется.

Исправленная строка вызывает setDelegate для vehicleResultViewController, который является экземпляром выделенного вами класса.Это будет работать, потому что setDelegate является методом экземпляра.

1 голос
/ 27 сентября 2011

Кажется, что вы объявили установщик для delegate как метод класса, обозначенный + в предупреждении.

Я предполагаю, что вы где-то объявили это ...

+ (void)setDelegate:(id <SomeProtocol>)aDelegate когда это должно быть - (void)setDelegate:(id <SomeProtocol>)aDelegate

...