-2

最終的には 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)PickerViewControllerNOviewDidLoad. プロパティが存在し、同時に存在しないのはどうしてですか?

4

2 に答える 2

2

You need to be sure that you're setting the delegate on the instance of the view controller that you put on screen. If you're using a navigation controller and segues to go between MainViewController and PickerViewController, then you should set the delegate in prepareForSegue:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    self.picker = (PickerViewController *)segue.destinationViewController;
    self.picker.derpy = self;
}
于 2013-07-16T23:40:05.357 に答える