我最终想编写一个包含 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)
仍然返回。财产怎么可能同时存在和不存在? NO
viewDidLoad