我有一个模态视图,可以让用户选择一些数据添加到表中。当用户按下保存按钮时,模态视图应该消失并将所需数据发送回视图控制器,该视图控制器呈现模态视图以供进一步处理。为实现这一目标,我已经建立了一个协议。原始视图控制器中的协议方法不会被调用。我的代码在下面,我做错了什么?
头文件(模态视图控制器):
@protocol AddTAFDataSource;
@interface AddTAFViewController : UIViewController <UIPickerViewDelegate, UIPickerViewDataSource> {
id<AddTAFDataSource> dataSource;
NSString *newICAOCode;
}
@property (nonatomic, assign) id<AddTAFDataSource> dataSource;
- (IBAction)saveButtonPressed;
@end
@protocol AddTAFDataSource <NSObject>
- (void)addNewTAF:(AddTAFViewController *)addTAFViewController icao:(NSString *)icaoCode;
@end
实施文件(模态视图控制器):
#import "AddTAFViewController.h"
#import "TAFandMETARViewController.h"
@implementation AddTAFViewController
@synthesize dataSource;
...
- (IBAction)saveButtonPressed {
[self.dataSource addNewTAF: self icao: newICAOCode];
}
@end
呈现视图控制器头文件:
#import "AddTAFViewController.h"
@interface TAFandMETARViewController : UITableViewController <AddTAFDataSource> {
}
@end
最后,呈现视图控制器:
#import "AddTAFViewController.h"
...
- (void)insertNewObject:(id)sender {
AddTAFViewController *addTAFViewController = [[AddTAFViewController alloc] initWithNibName: @"AddTAF" bundle: [NSBundle mainBundle]];
addTAFViewController.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
[(AddTAFViewController *)self.view setDataSource: self];
[self presentModalViewController: addTAFViewController animated: YES];
addTAFViewController = nil;
[addTAFViewController release];
}
- (void)addNewTAF:(AddTAFViewController *)addTAFViewController icao:(NSString *)icaoCode {
newICAO = icaoCode;
[self dismissModalViewControllerAnimated: YES];
}
提醒一下,上面的 - (void)addNewTAF:方法没有得到消息。非常感谢任何正确方向的帮助/指示。
答案 0 :(得分:2)
替换:
[(AddTAFViewController *)self.view setDataSource: self];
使用:
[addTAFViewController setDataSource:self]
毕竟,dataSource是控制器的属性,而不是控制器的视图。
答案 1 :(得分:0)
你现在错了:
[(AddTAFViewController *)self.view setDataSource: self];
你应该写这个:
addTAFViewController.dataSource = self;
答案 2 :(得分:0)
不是尝试使用单独的对象(您的dataSource)在两个视图控制器之间传递数据,您可以简单地使用添加属性直接在您将以模态方式呈现的视图控制器中包含数据(此处, AddTAFViewController
)。
然后在用于解除模态视图控制器的方法中,在解除它之前,您可以发送[self modalViewController]
来获取模态视图控制器,此时父视图控制器可以向它发送它想要的任何消息。这将允许您从模态视图控制器中获取所需的任何数据,因此您根本不需要数据源和协议。