最終的には ALAssetsLibrary を組み込んだ iOS アプリを作成したいと考えていますが、委任を理解するための第一歩として、2 つのビュー コントローラー間で単純なメッセージを渡そうとしています。何らかの理由で、メッセージを渡すことができないようです。特に、デリゲート オブジェクト (derpy) は存在しないようです ( をif(self.derpy)
返しますNO
)。
Apple フォーラムで同じ質問をしたところ、セグエを使用してプロパティを設定し、代わりに self.child を使用してメソッドを呼び出す必要があると言われましたが、それは奇妙に思えます。親/子プロパティを使用してメッセージを渡す場合でも、Interface Builder でビューを作成できますか? たとえば、UINavigationController 内で 2 つのビューを設定すると、それらの間でメッセージをやり取りできるように、実際にそれらを「接続」する方法がわかりません。質問が広すぎる場合は申し訳ありません。
プロトコルを宣言しているコントローラーは次のとおりです( PickerViewController と呼ばれます):
インターフェース:
#import <UIKit/UIKit.h>
#import <AssetsLibrary/AssetsLibrary.h>
@protocol DerpDelegate <NSObject>
@required
- (void) test;
@end
@interface PickerViewController : UIViewController
@property (nonatomic, assign) id<DerpDelegate> derpy;
@end
実装:
#import "PickerViewController.h"
@interface PickerViewController ()
@end
@implementation PickerViewController
- (void)viewDidLoad
{
[super viewDidLoad];
if (self.derpy) { // If the delegate object exists
[self.derpy test]; // send it this message
} else {
NSLog(@"Still not working."); // This always returns (i.e., self.derpy doesn't exist)
}
}
デリゲート コントローラー (MainViewController) インターフェイス:
#import <UIKit/UIKit.h>
#import "PickerViewController.h"
@interface MainViewController : UIViewController <DerpDelegate> // public promise to implement delegate methods
@property (strong, nonatomic) PickerViewController *picker;
- (void) test;
@end
そして最後に、デリゲート コントローラー (MainViewController) の実装:
#import "MainViewController.h"
#import "PickerViewController.h"
@interface MainViewController ()
@end
@implementation MainViewController
// Here's that method I promised I'd implement
- (void) test{
NSLog(@"Test worked."); // This never gets called
}
- (void)viewDidLoad {
[super viewDidLoad];
self.picker.derpy = self;
//lazy instantiation
- (PickerViewController *) picker{
if(!_picker) _picker = [[PickerViewController alloc]init];
return _picker;
}
編集: で正しい方向に向けてくれた rydgaze に感謝しますself.picker.derpy = self
が、何らかの理由で、まだ正しく機能していません。重要なのは、そのプロパティが設定されると、 MainViewController からif(self.picker.derpy)
返されることYES
です。ただし、 if(self.derpy)
PickerViewControllerNO
のviewDidLoad
. プロパティが存在し、同時に存在しないのはどうしてですか?