我在代码中尝试了许多自定义委托示例,以将数据从视图B发送回父视图A。为什么会出现NULL?我应该缺少一些东西。请帮忙。如何在父视图中调用setupDate以接收(NSDate *)setAlarmDate?
父视图
#import "SetupViewController.h"
@interface ViewController : UIViewController <SetupViewControllerDelegate> {
NSTimer *timer;
}
@end
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
if ([[segue identifier] isEqualToString:@"setupview"]) {
NSLog(@"prepare for segue");
SetupViewController *svc = [[SetupViewController alloc] init];
svc.delegate = self;
-(void)setupDate:(NSDate *)setAlarmDate{
NSLog(@"Hey Hey");
NSLog(@"%@", setAlarmDate);
}
@end
查看B
@protocol SetupViewControllerDelegate <NSObject>
@required
-(void)setupDate:(NSDate *)setAlarmDate;
@end
@interface SetupViewController : UIViewController
@property (nonatomic, strong) id <SetupViewControllerDelegate> delegate;
//IB
@property (weak, nonatomic) IBOutlet UIDatePicker *pDatePicker;
@end
.m
#import "SetupViewController.h"
#import "ViewController.h"
@implementation SetupViewController
-(void)viewWillDisappear:(BOOL)animated{
NSDate *date = [self.pDatePicker date];
[[self delegate] setupDate:date];
}
@end
您应该UIViewController
使用segue的destinationViewController
属性访问,而不是分配您自己的实例,这就是您的的原因alarmDate = NULL
。
例如
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([[segue identifier] isEqualToString:@"setupview"])
{
NSLog(@"prepare for segue");
SetupViewController *svc = [segue destinationViewController];
svc.delegate = self;
}
}
此外,正如@Neru所提到的,您的代表应被限定为软弱而不是强壮。这样做的原因是,如果未delegate = nil
在dealloc方法中显式设置,则会导致一个保留周期。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句