3

Developer Library の助けを借りて、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 と 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れます。

AddEventViewController継承しますUIViewControllerが、delegateプロパティは最初でも2番目でも宣言されていません。そのため、コンパイラは満足していません。

あなたはそれを宣言する必要があります。次のようなもの:

@interface AddEventViewController : UIViewController

@property (nonatomic, assign) id delegate;  

@end

@implementation AddEventViewController

@synthesize delegate;

@end

デリゲートは通常assign、サークルの保持を防ぐために属性で宣言されます (例、A保持BB保持A) 。

于 2012-01-30T23:03:35.410 に答える