2013-03-05 2 views
0

Я использую делегирование между двумя классами, чтобы получать уведомления в случае, если есть обновление или объект должен быть добавлен. первый класс является подклассом UITableViewController, а второй является подклассом UIViewController. у первого класса есть плюс (addButton), чтобы добавить объекты в его табличный вид. второй класс - это представление, к которому первый переходит, когда нажата кнопка добавления. Таким образом, в классе контроллера представления я добавил протокол в файле .h:мой пользовательский делегат не работает

@protocol ViewControllerDelegate <NSObject> 

- (void) addViewControllerDelegate:(ViewController *)controller didUpdateEvent:(Event *) event; 

@end 

и я добавил делегат @propety:

@property (weak, nonatomic) id <SSAddViewControllerDelegate> delegate; 

в файле .m добавил следующее в методе IBAction что получает срабатывает, когда кнопка сохранения нажата:

[self.delegate addViewControllerDelegate:self didUpdateEvent: event]; 

теперь собираюсь вернуться к табличному классу контроллера в файле .h я добавил и в файле .m я добавил следующий метод:

- (void) addViewControllerDelegate:(ViewController *)controller didUpdatEvent:(Event *)event{ 
    [self saveNewEntry:event]; 
    NSLog(@"DELEGATE"); 
} 

ПРОБЛЕМА: он не работает. хотя я думаю, я сделал все, что нужно сделать.

Примечания: Я изменил имена классов здесь, так что у меня не было класса класса ViewController. saveNewEntry используется для добавления объекта события в мой массив, и nslog находится там, чтобы узнать, действительно ли он ввел этот метод.

// ---------------------------------- более актуальный код ------- ----------------------- Второй класс (вид контроллера) .h и .m соответственно

@class Course; 
@class SSAddViewController; 

@protocol SSAddViewControllerDelegate; 

@interface SSAddViewController : UIViewController <UITextFieldDelegate> 
@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext; 
@property (weak, nonatomic) id <SSAddViewControllerDelegate> delegate; 
@end 

@protocol SSAddViewControllerDelegate <NSObject> 

- (void) addViewControllerDelegate:(SSAddViewController *)controller didUpdateCourse:(Course *) course; 

@end 
@class Course; 
@class SSAddViewController; 

@protocol SSAddViewControllerDelegate; 

@interface SSAddViewController : UIViewController <UITextFieldDelegate> 
@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext; 
@property (weak, nonatomic) id <SSAddViewControllerDelegate> delegate; 
@end 

@protocol SSAddViewControllerDelegate <NSObject> 

- (void) addViewControllerDelegate:(SSAddViewController *)controller didUpdateCourse:(Course *) course; 

@end 

- (void) saveNewEntry 
{ 
    SSAppDelegate *appDelegate = [UIApplication sharedApplication].delegate; 
    NSManagedObjectContext *context = [appDelegate managedObjectContext]; 
    Course *course = (Course *) [NSEntityDescription insertNewObjectForEntityForName:@"Course" inManagedObjectContext:context]; 
    NSLog(@"YES"); 
    [course setCourseName:self.nameTextField.text]; 
    [course setCourseCredits:[NSNumber numberWithInt:[self.creditstextField.text intValue]]]; 
    [course setCourseChapters:[NSNumber numberWithInt:[self.chaptersTextField.text intValue]]]; 

    if (hasChanges) { 
     [self.delegate addViewControllerDelegate:self didUpdateCourse:course]; 
    } 
} 

первый класс (вид таблицы). ч и .m соответственно:

@interface SSCoursesViewController : UITableViewController <SSAddViewControllerDelegate> 




- (void) addViewControllerDelegate:(SSAddViewController *)controller didUpdateCourse:(Course *)course{ 
    [self saveNewEntry:course]; 
    NSLog(@"DELEGATE"); 
} 
+0

Вы когда-нибудь задавали делегат? –

+0

Вы имеете в виду тот, который я добавил? делегат @property? – user1938695

+0

да, где-то в вашем коде вам нужно что-то установить, иначе ничего не произойдет –

ответ

0

Где ваш SSAddViewController создан? Вы используете segue как часть своего раскадровки или вы создаете его напрямую?

если вы используете SEGUE, вам нужно реализовать prepareForSeque в вашем SSCoursesViewController

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    SSAddViewController *ssavc = (SSAddViewController *)[segue destinationViewController]; 

    ssavc.delegate = self; 

} 

, если вы создаете SSAddViewController напрямую, вы можете установить его непосредственно.

Я не сижу у своего Mac прямо сейчас, но приведенный выше код приблизительно правильный.

+0

Да SSAddViewController - это контроллер представления, который создается модальным сегментом. Я попробую это. – user1938695

0

ли вы на самом деле установить в вашем коде SSAddViewControllerDelegate = self;?

+0

мм..не какой делегат вы имеете в виду> тот, который я набрал как идентификатор? – user1938695

+0

@ user1938695 То, что он имеет в виду, это то, что вы задали свойство 'delegate' диспетчера представлений некоторого значения? – rmaddy

+0

о нет, я этого не сделал. если бы я должен был это сделать, мне нужно это сделать? в его сеттер? и к какой ценности? – user1938695

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