Свойство «делегат» не найдено для объекта «AddEventViewController» - PullRequest
3 голосов
/ 31 января 2012

С помощью библиотеки разработчика я пытаюсь работать с фреймворками EventKit и EventKitUI.Я столкнулся с очень ранним блокпостом.Я скопировал и вставил код из библиотеки, найденной здесь .Я добавил контроллер представления с именем AddEventViewController - кнопку на панель навигации в моем ViewController, и я использую этот код для его вызова.

- (IBAction)add:(id)sender {
AddEventViewController *addController = [[AddEventViewController alloc]
                                          init];
addController.delegate = self;
UINavigationController *navigationController = [[UINavigationController alloc]
                                                    initWithRootViewController:addController];
[self presentViewController:navigationController animated:YES completion: nil];

}

Ошибка отображается в строке: addController.delegate = self;

Этот код скопирован прямо из библиотеки.Я использую Xcode 4.2 и раскадровку, если это может помочь.

ОБНОВЛЕНИЕ: Это AddEventViewController.h:

#import <UIKit/UIKit.h>

@interface AddEventViewController : UIViewController

@end

Вы скажете мне, что я создал этот ViewController неправильно?Пожалуйста, объясните, почему просто нет "как", если вы будете так милы?

Ответы [ 2 ]

4 голосов
/ 31 января 2012

Я вижу, как пример Apple здесь, вероятно, смутил вас здесь.Сначала загрузите полный исходный код iPhoneCoreDataRecipes (или, по крайней мере, сделайте ссылку на него, пытаясь понять этот код).

Чтобы действительно понять, что здесь происходит, вы должны прочитать далеераздел «Отклонение представленного контроллера представления», а затем перейдите по ссылке «Использовать делегирование для связи с другими контроллерами».(«Делегация?» Очень странно ....)

Итак, вот что происходит.Представленное представление имеет «делегата», который является объектом, которому он должен рассказывать «интересные» вещи.В данном случае «интересными» вещами являются «эй, я добавил рецепт!»Для достижения этого делегат реализует протокол, который просто означает, что он обещает реализовать некоторые методы.В этом случае обязательный метод recipeAddViewController:didAddRecipe:.

AddViewController имеет свойство delegate, например:

@property(nonatomic, assign) id <RecipeAddDelegate> delegate;

Это просто означает, что делегат должен соответствовать именованномупротокол.Сам делегат указывает, что он делает это в своем интерфейсе:

@interface RecipeListTableViewController : UITableViewController <RecipeAddDelegate, NSFetchedResultsControllerDelegate> {

Обратите внимание, что это помечено assign по причинам, объясняемым @Yuras.Но если вы пишете новый код для iOS 5, вам следует использовать weak вместо assign.Свойства weak автоматически устанавливаются на nil, если их объект, на который делается ссылка, освобожден.Так безопаснее.Нет висящих указателей.

3 голосов
/ 31 января 2012

В Objective-C любое свойство, которое вы используете, должно быть где-то объявлено. Любые свойства, объявленные в родительском классе (UIViewController в вашем случае), наследуются всеми производными классами (AddEventViewController в вашем случае).

AddEventViewController наследует UIViewController, но свойство delegate не объявляется ни в первом, ни во втором. Вот почему компилятор не в восторге.

Вы должны объявить это. Примерно так:

@interface AddEventViewController : UIViewController

@property (nonatomic, assign) id delegate;  

@end

@implementation AddEventViewController

@synthesize delegate;

@end

Делегаты обычно объявляются с атрибутом assign, чтобы предотвратить сохранение круга (например, A сохраняет B и B сохраняет A)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...