2010-07-16 2 views
4

У меня есть простой проект, чтобы представить контроллер модального представления и передать обратно строку на основе какой кнопки в модальном VC, который нажимается. Я основывал все это на просмотре класса Stanford на iTunes U. Похоже, у меня все правильно, но я получаю пару предупреждений компилятора.Реализация методов делегирования для передачи данных диспетчера модального представления

Сначала я получить один называется passing argument 1 of 'setDelegate:' from incompatible pointer type в TransferViewController.m

Во-вторых я получаю четыре предупреждения называется Invalid receiver type 'id <MyModalViewControllerDelegate>*', но они не отображаются в области результатов сборки, а рядом с нарушителями линий в MyModalViewController.m, обе строки в каждом из кнопки.

Вот код ...

// TransferViewController.h 

#import <UIKit/UIKit.h> 
#import "MyModalViewController.h"; 

@interface TransferViewController : UIViewController <MyModalViewControllerDelegate> { 
    UILabel *label; 
    UIButton *button; 
} 

@property (nonatomic, retain) IBOutlet UILabel *label; 
@property (nonatomic, retain) UIButton *button; 

- (IBAction)updateText; 

@end 

// TransferViewController.m 

#import "TransferViewController.h" 

@implementation TransferViewController 

@synthesize label; 
@synthesize button; 

- (IBAction)updateText { 
    MyModalViewController *myModalViewController = [[MyModalViewController alloc] init]; 
    myModalViewController.delegate = self; // I get the warning here. 
    [self presentModalViewController:myModalViewController animated:YES]; 
    [myModalViewController release]; 
} 

- (void)myModalViewController:(MyModalViewController *)controller didFinishSelecting:(NSString *)selectedDog { 
    label.text = selectedDog; 
    [self dismissModalViewControllerAnimated:YES]; 
} 

@end 

// MyModalViewController.h 

#import <UIKit/UIKit.h> 

@protocol MyModalViewControllerDelegate; 

@interface MyModalViewController : UIViewController { 
    UIButton *abby; 
    UIButton *zion; 
    id <MyModalViewControllerDelegate> delegate; 
} 

@property (assign) id <MyModalViewControllerDelegate> delegate; 

- (IBAction)selectedAbby; 
- (IBAction)selectedZion; 

@end 

@protocol MyModalViewControllerDelegate <NSObject> 

@optional 

- (void)myModalViewController:(MyModalViewController *)controller didFinishSelecting:(NSString *)selectedDog; 

@end 

// MyModalViewController.m 

#import "MyModalViewController.h" 

@implementation MyModalViewController 

@synthesize delegate; 

- (IBAction)selectedAbby { 
    if ([self.delegate respondsToSelector:@selector (myModalViewController:didFinishSelecting:)]) { 
     [self.delegate myModalViewController:self didFinishSelecting:@"Abby"]; 
    } 
} 

- (IBAction)selectedZion { 
    if ([self.delegate respondsToSelector:@selector (myModalViewController:didFinishSelecting:)]) { 
     [self.delegate myModalViewController:self didFinishSelecting:@"Zion"]; 
    } 

} 

ответ

4

Избавиться от этих * с после id <something> и BEF руда delegate.

Так делают этот

id <MyModalViewControllerDelegate> *delegate; 

это

id <MyModalViewControllerDelegate> delegate; 
+0

Еще раз спасибо! Наверное, я солгал в моем другом вопросе, когда я сказал, что понял концепцию использования делегата, но я думаю, что сейчас. Когда я определяю метод делегата в родительском VC, поскольку он реализован в родительском, он имеет доступ к ivars в родительском. Когда модальный VC использует этот метод, он возвращает канал обратно родительскому. – Steve

+0

Что касается проблемы с недопустимым типом, я думаю, что это один из тех случаев, когда Objective-C настолько разрешительный, что меня устраивает. Он был счастлив позволить мне неправильно определить делегата в качестве указателя, но только расстроился, когда я на самом деле пытался использовать его таким образом - намек на то, как я определил, было бы неплохо в предупреждении компилятора. Возможно, в xCode 4! – Steve

+0

Yup, похоже, что вы его получите :) Делегат по-прежнему указывает на объект, поэтому, если вы скажете делегат SomeDelegateClass *, вам все равно понадобится *, дело в том, что идентификатор уже имеет это * 'внутри' это, поэтому вам не нужно явно писать его. –

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