我的问题是如何使用uinavigationcontroller将数据从第二视图控制器发送回第一视图控制器。 我在导航控制器上有2个按钮来发送数据或取消,如 2ndviewcontroller.h包含 // ------------------------------------------------ ------
@class DetailsViewController;
@protocol DetailsViewControllerDelegate <NSObject>
- (void)detailsViewControllerDidCancel:(DetailsViewController *)controller;
- (void)detailsViewControllerDidSave:(DetailsViewController *)controller;
@end
@interface DetailsViewController : UIViewController
{
UITextField *nameTextField;
UITextField *versionTextField;
UITextField *companyTextField;
}
@property (nonatomic, weak) id <DetailsViewControllerDelegate> delegate;
- (void)cancel:(id)sender;
- (void)save:(id)sender;
//-------------------------------------------------------------
2ndviewcontroller.m contains
- (void)cancel:(id)sender
{
[self.delegate detailsViewControllerDidCancel:self];
}
- (void)save:(id)sender
{
[self.delegate detailsViewControllerDidSave:self];
}
而我的1stviewcontroller实现了2ndviewcontroller的委托, // ------------------------------------------------ ----
- (void)detailsViewControllerDidCancel:(DetailsViewController *)controller
{
[detailedViewController dismissViewControllerAnimated:YES completion:nil];
}
- (void)detailsViewControllerDidSave:(DetailsViewController *)controller
{
detailedViewController = [self.navigationController viewControllers][0];
[self dismissViewControllerAnimated:YES completion:nil];
}
// --------------------------------------------- ---------
请问有什么想法吗? 我正在以编程方式处理所有事务,而不是使用任何故事板。答案 0 :(得分:0)
您需要了解从detail-view-controller到parent-view-controller权限的数据传递。在委托中提到值的字符串,或数据的任何数组,然后在父级中,您将得到它。
首先,当您从Detail-View-Controller调用委托时。我已将响应添加到选择器,以避免在委托是可选的并且未在父类中声明时崩溃。
- (void)save:(id)sender
{
if (self.delegate && [self.delegate respondsToSelector:@selector(detailsViewControllerDidSave:version:company:)]) {
[self.delegate detailsViewControllerDidSave:nameTextField.text version:versionTextfield.text company:companyTextfield.text];
}
}
- (void)cancel:(id)sender
{
if (self.delegate && [self.delegate respondsToSelector:@selector(detailsViewControllerDidCancel)]) {
[self.delegate detailsViewControllerDidCancel];
}
}
在Parent-View-Controller中,无需传递整个UIViewController本身。只传递必要的值,在您的情况下我假设名称,版本和公司。
- (void)detailsViewControllerDidCancel
{
// No data required/// and just dissmisses the screen
[self dismissViewControllerAnimated:YES completion:nil];
}
- (void)detailsViewControllerDidSave:(NSString *)name version:(NSString*)version company:(NSString*)company
{
// you can use the values as parameter.. name, version, company
// ......
[self dismissViewControllerAnimated:YES completion:nil];
}
示例代码:
如果您想作为数组发送,请执行以下操作
父视图控制器 - (void)detailsViewControllerDidSave:(NSMutableArray *)listOfValues {
// you can use the list of values
// ......
[self dismissViewControllerAnimated:YES completion:nil];
}
详细 - 视图 - 控制器
- (void)save:(id)sender
{
if (self.delegate && [self.delegate respondsToSelector:@selector(detailsViewControllerDidSave:)]) {
[self.delegate detailsViewControllerDidSave:[NSMutableArray arrayWithObjects:nameTextfield.text, versionTextfield.text, companyTextfield.text, nil]];
}
}
更改协议声明
@protocol DetailsViewControllerDelegate <NSObject>
- (void)detailsViewControllerDidCancel;
- (void)detailsViewControllerDidSave:(NSMutableArray *)listOfValues;
@end