0

我在代碼中嘗試了很多自定義委託示例,以便將數據從視圖B發回到父視圖A.爲什麼我會得到NULL?應該有我缺少的東西。請幫忙。我怎麼能調用setupDate在父視圖中接收(NSDate *)setAlarmDate?iOS7通過協議在導航控制器推送視圖設置向後傳遞數據

父視圖

#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 
+0

in viewWillDisappear:動畫你的代表是零?而且任何代表都應該具有弱的屬性。你還應該檢查你的委託響應選擇器是否可能導致崩潰 – Neru

+0

@Neru使它變弱。謝謝。 – nelm

回答

2

你應該使用SEGUE的destinationViewController屬性,而不是分配自己的實例訪問UIViewController,這就是爲什麼你的alarmDate = NULL

E.g.

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([[segue identifier] isEqualToString:@"setupview"]) 
    { 
     NSLog(@"prepare for segue"); 
     SetupViewController *svc = [segue destinationViewController]; 
     svc.delegate = self; 
    } 
} 

而且,@Neru提到您的代理應該被定性爲弱而不強。原因是因爲如果您沒有在dealloc方法中明確設置delegate = nil,則會導致保留週期。

+0

是的!有效。謝謝。秒與segue destinationViewController解決了這個問題。我完全誤解了自我實例化視圖控制器的含義。謝謝。 – nelm

相關問題