在对象'AddEventViewController'上找不到属性'委托'

时间:2012-01-30 22:23:11

标签: objective-c ios xcode eventkit

在Developer Library的帮助下,我正在尝试使用EventKit和EventKitUI框架。我打了很早的路障。我复制并粘贴了code from the library found here。我添加了一个名为' 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吗?请解释为什么不是&#34;怎么&#34;如果你真好吗?

2 个答案:

答案 0 :(得分:4)

我看到Apple的例子在这里可能会让你感到困惑。首先,下载iPhoneCoreDataRecipes的完整源代码(或至少在尝试理解此代码时引用它)。

要真正了解这里发生了什么,您需要阅读“解雇提供的视图控制器”一节,然后点击“使用委派与其他控制器通信”链接。 (“一个代表团?”非常奇怪......)

所以这就是正在发生的事情。呈现的视图有一个“委托”,它应该告诉“有趣”的东西。在这种情况下,“有趣”的东西是“嘿,我添加了一个食谱!”为了实现这一点,委托实现了一个协议,这意味着它承诺实现一些方法。在这种情况下,所需方法为recipeAddViewController:didAddRecipe:

AddViewControllerdelegate属性,如下所示:

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

这只意味着委托必须符合指定的协议。委托本身表明它在其界面中这样做:

@interface RecipeListTableViewController : UITableViewController <RecipeAddDelegate, NSFetchedResultsControllerDelegate> {

请注意,由于@Yuras解释原因,此标记为assign。但是,如果您要编写针对iOS 5的新代码,则应使用weak代替assign。如果已释放其引用的对象,weak属性将自动设置为nil。这样更安全。没有悬空指针。

答案 1 :(得分:3)

在Objective-C中,您使用的任何属性都应该在某处声明。在父类(在您的情况下为UIViewController)中声明的任何属性都由所有派生类(在您的情况下为AddEventViewController)继承。

AddEventViewController继承UIViewController,但delegate属性既未在第一个中声明,也未在第二个中声明。这就是编译器不满意的原因。

你应该声明它。像下一个:

@interface AddEventViewController : UIViewController

@property (nonatomic, assign) id delegate;  

@end

@implementation AddEventViewController

@synthesize delegate;

@end

代表通常使用assign属性声明,以防止圈子保留(例如A保留BB保留A