3

在开发者库的帮助下,我正在尝试使用 EventKit 和 EventKitUI 框架。我很早就遇到了障碍。我从这里找到的库中复制并粘贴了代码。我在 ViewController 的导航栏中添加了一个名为“AddEventViewController”的视图控制器,并使用此代码来调用它。

- (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 和 Storyboard。

更新:这是 AddEventViewController.h:

#import <UIKit/UIKit.h>

@interface AddEventViewController : UIViewController

@end

你会告诉我我错误地创建了这个 ViewController 吗?请解释如果你这么好,为什么不“如何”?

4

2 回答 2

4

我看到 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只是这样更安全。没有悬空指针。

于 2012-01-30T23:18:10.213 回答
3

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

AddEventViewControllerinherits UIViewController,但该delegate属性未在第一个或第二个中声明。这就是编译器不高兴的原因。

你应该声明它。类似下一个:

@interface AddEventViewController : UIViewController

@property (nonatomic, assign) id delegate;  

@end

@implementation AddEventViewController

@synthesize delegate;

@end

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

于 2012-01-30T23:03:35.410 回答