在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;如果你真好吗?
答案 0 :(得分:4)
我看到Apple的例子在这里可能会让你感到困惑。首先,下载iPhoneCoreDataRecipes的完整源代码(或至少在尝试理解此代码时引用它)。
要真正了解这里发生了什么,您需要阅读“解雇提供的视图控制器”一节,然后点击“使用委派与其他控制器通信”链接。 (“一个代表团?”非常奇怪......)
所以这就是正在发生的事情。呈现的视图有一个“委托”,它应该告诉“有趣”的东西。在这种情况下,“有趣”的东西是“嘿,我添加了一个食谱!”为了实现这一点,委托实现了一个协议,这意味着它承诺实现一些方法。在这种情况下,所需方法为recipeAddViewController:didAddRecipe:
。
AddViewController
有delegate
属性,如下所示:
@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
保留B
和B
保留A
)