web-dev-qa-db-ja.com

アプリデリゲートの処理とビューの切り替え

*const _strongをタイプidに渡すことに関連するセマンティックの問題について警告が表示され、何を変更しても修正できないようです。

現在、2つのビューがあり、このコードを記述しています。 iPadSpeckViewController.mで、ビューを切り替える必要があるメソッドは次のとおりです。

-(IBAction) touchProducts {
    ProductsViewController *controller = [[ProductsViewController alloc]
            initWithNibName:@"Products" bundle:nil];
    controller.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
    controller.delegate = self;
    [self presentModalViewController:controller animated:YES];
}

そしてProductsViewController.hの場合:

@interface ProductsViewController : UIViewController {
    id<ProductsViewControllerDelegate> delegate;
}
@property(nonatomic, retain)
    IBOutlet id<ProductsViewControllerDelegate> delegate;

ProductsViewController.mに含まれるもの:

@synthesize delegate;

しかし、ビューは切り替わりません...考え?

編集:「controller.delegate = self;」の行に表示される正確な警告は、次のとおりです。 iPadSpeckViewController.mの場合:

/Developer/iPadSpeckApp/iPadSpeckApp/iPadSpeckAppViewController.m:17:27:{17:27-17:31}: warning: passing 'iPadSpeckAppViewController *const __strong' to parameter of incompatible type 'id<ProductsViewControllerDelegate>' [3]
29
Chris

この警告は奇妙な言い回しですが、実際には、selfのクラス(そのクラスが何であれ)がProductsViewControllerDelegateプロトコルに準拠していないことを通知する方法にすぎません。警告を取り除くには、2つの選択肢があります。

  • @interfaceステートメントでselfのクラス(そのクラスが何であれ)を宣言して、プロトコルProductsViewControllerDelegateに準拠します。

    @interface MyClass : NSObject <ProductsViewControllerDelegate>;
    
  • これを変更して警告を抑制します。

    controller.delegate = self;
    

    これに:

    controller.delegate = (id)self;
    

デリゲートプロパティはid<ProductsViewControllerDelegate>と入力されます。しかし、自己はそうではありません。 ARCでは、型が正式に一致するように、キャストを明示的にする必要があります。 (これは、ARCが正しいメモリ管理の決定を行うのに十分な情報を持っていることを絶対に確認できるようにするためだと思います。)

152
matt

間違ったプロトコル(UINavigationControllerDelegateではなくUINavigationBarDelegate)を実装したオブジェクトにUINavigationControllerのデリゲートを設定しようとすると、同じエラーが発生しました。これは単純なタイプミスかもしれません。

0
Christoph