2012-01-30 15 views
3

在Developer Library的幫助下,我嘗試使用EventKit和EventKitUI框架。我遇到了很早的路障。我已複製並粘貼code from the library found here。我在ViewController的導航欄中添加了一個名爲'AddEventViewController'的視圖控制器,我使用這段代碼來調用它。在'AddEventViewController'對象上沒有找到屬性'delegate'

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

UPDATE: 這是AddEventViewController.h:

#import <UIKit/UIKit.h> 

@interface AddEventViewController : UIViewController 

@end 

你要告訴我,我創造了這個視圖控制器不正確?請解釋一下,爲什麼只是不「如何」,如果你會這麼好?

+0

你確定你的'AddEventViewController'實際上有'委託'屬性嗎?請發佈它的聲明。 – Yuras 2012-01-30 22:33:05

回答

4

我怎麼看蘋果的例子在這裏已經有可能混淆你在這裏。首先,下載iPhoneCoreDataRecipes的完整源代碼(或者至少在試圖理解此代碼時參考它)。

要真正理解這裏發生了什麼,您需要詳細閱讀「解除呈現的視圖控制器」部分,然後按照「使用委託與其他控制器通信」的鏈接。 (「一個代表團?」很奇怪....)

所以這裏是發生了什麼事情。呈現的視圖有一個「代表」,它是應該告訴「有趣」事物的對象。在這種情況下,「有趣」的事情是「嘿,我加了一個食譜!」爲了達到這個目的,委託人實現了一個協議,這意味着它承諾實施一些方法。在這種情況下,所需的方法是recipeAddViewController:didAddRecipe:

AddViewControllerdelegate屬性是這樣的:

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

這只是意味着該委託必須符合指定的協議。委託本身就說明它在其接口這樣做:

@interface RecipeListTableViewController : UITableViewController <RecipeAddDelegate, NSFetchedResultsControllerDelegate> { 

注意,這是原因@Yuras解釋標記assign。但是,如果您要編寫針對iOS 5的新代碼,則應該使用weak而不是assign。如果其被引用的對象被釋放,則weak屬性會自動設置爲nil。這樣更安全。沒有懸掛指針。

+0

你只是偷了Yuras的正確答案......感謝您的解釋。 – 2012-01-30 23:55:10

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

+1

另外,從iOS SDK中讀取與UITableViewController,UITableViewDataSource和UITableViewDelegate相關的頭文件可能是一個好主意,以瞭解如何使用委託設計類。 – Yuras 2012-01-30 23:12:49

+1

感謝您解釋這一點。現在我必須回去真正理解代表是什麼。我絕對「錯過了」過去一個月的這一課。 – 2012-01-30 23:51:31