-2

我最终想编写一个包含 ALAssetsLibrary 的 iOS 应用程序,但作为理解委托的第一步,我试图在两个视图控制器之间传递一个简单的消息。出于某种原因,我似乎无法让消息通过。特别是,委托对象(derpy)似乎不存在(if(self.derpy)returns NO))。

我在 Apple 论坛上问了同样的问题,并被告知我应该使用 segues 并使用 self.child 设置属性/调用方法,但这似乎很奇怪。如果我要使用父/子属性传递消息,我仍然可以在 Interface Builder 中创建我的视图吗?一旦我设置了两个视图,比如在 UINavigationController 中,我不确定如何实际“连接它们”,以便在它们之间传递消息。对不起,如果问题过于宽泛。

这是我在其中声明协议的控制器(称为 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,但由于某种原因,事情仍然无法正常工作。重要的是,一旦设置了该属性,就会从 MainViewControllerif(self.picker.derpy)返回。YES但是从 PickerViewController 内部调用时if(self.derpy)仍然返回。财产怎么可能同时存在和不存在? NOviewDidLoad

4

2 回答 2

2

您需要确保在放置在屏幕上的视图控制器实例上设置委托。如果您使用导航控制器并在 MainViewController 和 PickerViewController 之间切换,那么您应该在 prepareForSegue 中设置委托:

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

您需要先填充委托。

基本上,你的 MainViewController 应该在某个时候做一个

picker.derpy = self;

然后当委托在 PickerViewController 中触发时,回调就会发生。

编辑:一个好的做法是在 PickerViewController 中做类似的事情

@property (nonatomic, assign) id<DerpDelegate > derpy;

并在您的 MainViewController 中表明您将实现委托

@interface MainViewController : UIViewController<DerpDelegate>

最终在 MainViewController 的实现中

你会有类似的东西

picker = [[PickerViewController alloc]init];
picker.derpy = self;
[picker doYourThing];

选择器完成后,它可能希望使用委托返回结果。

于 2013-07-16T22:10:23.500 回答