【发布时间】:2015-11-10 23:02:21
【问题描述】:
我想将数据从我的一个控制器传递到另一个。为此,我在第二个视图控制器中实现委托(它在第一个视图控制器上使用点击“加号”按钮时调用):
委托声明:
@protocol AddTaskDelegate <NSObject>
-(void)addTask:(NSString*)task byDate:(NSDate*)date;
@end
委托的实现:
- (IBAction)addTask:(id)sender {
if ([self.addTextField.text length] >0){
NSDate *now = [NSDate date];
[self.delegateObj addTask:self.addTextField.text byDate:now];
[self dismissViewControllerAnimated:YES completion:nil];
} else {
NSLog(@"You should type something");
}
}
在viewController1:
addController.delegateObj = self;
...
然后:
-(void)addTask:(NSString *)task byDate:(NSDate *)date {
myDateToFill = date;
myStringToFill = task;
NSLog(@"myStringToFill is - %@", task);
NSLog(@"method called");
}
然而,addTask 方法未被调用(它假定返回在第二个视图控制器中计算的值)。我错过了什么?
更新:
我更新了我的 addTask 方法以进行跟踪并确定我的委托对象为 nil:
- (IBAction)addTask:(id)sender {
if ([self.addTextField.text length] >0){
NSDate *now = [NSDate date];
NSLog(@"Prepare for repair");
if (self.delegateObj == nil){
NSLog(@"ALARM");
}
[self.delegateObj customMethod];
[self.delegateObj taskAdded:self addTask:self.addTextField.text byDate:now];
[self dismissViewControllerAnimated:YES completion:nil];
} else {
NSLog(@"You should type something");
}
}
现在在控制台中我可以看到“警报”输出,它告诉我 self.delegateObj 出于某种原因为 nil。
已更新。之后解决(并从实现中删除对 AddTask 控制器的引用):
- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
// Если нету navigation Controller'a
if ([segue.identifier isEqualToString:@"add"]){
UINavigationController *navController = [segue destinationViewController];
AddViewController *addController = (AddViewController*)([navController viewControllers][0]);
addController.delegate = self;
}
}
【问题讨论】:
-
您是否在
protocol中符合ViewController1.h中的代表? -
是的,我做到了。也许我忘了在委托方法中传递对 ViewControllerB 的引用?
-
viewController1中addController的引用在哪里设置
-
@zcui93 在实现中:AddViewController *addController;,然后在 viewDidLoad:addController.delegateObj = self;
-
能否在 AddController 中包含将委托设置为 viewController1 实例的代码
标签: ios objective-c delegates