如何将表单 FormSeetController 中的数据传递给 ViewController?
Posted
技术标签:
【中文标题】如何将表单 FormSeetController 中的数据传递给 ViewController?【英文标题】:How to pass data from form FormSeetController to the ViewController? 【发布时间】:2014-07-27 15:58:34 【问题描述】:我正在尝试使用这个包:
https://github.com/m1entus/MZFormSheetController
现在我的问题是,我在关闭 formSheet 后尝试在 FormSeetController 之间传递数据到 ViewController。
这是我到目前为止所尝试的: 在创建表单的按钮中的 ViewController 中:
formSheet.didDismissCompletionHandler = ^(UIViewController *vc)
// maybe i can use UIViewController *vc as my SearchGardenView (form Sheet), but how?
[self formSheetDidDismissed]; // here i tryin to get the kidGardenID but its always nil;
;
这是来自 FormSeetController:
AddKid *kid = [[AddKid alloc]init];
NSArray *temp = [_responseDict valueForKey:@"ID"];
kid.kidGardenID = [temp objectAtIndex:indexPath.row];
[self mz_dismissFormSheetControllerAnimated:YES completionHandler:^(MZFormSheetController *formSheetController)
//this block dismiss the formSheet.
];
我需要将“kidGardenID”传递给 ViewController,但它始终为零,即使我给它一个值,如上面的代码所示.. 可能是因为 ViewController 已经加载,当我从 fortSheet 回来时它没有再次加载?
我需要找到一种方法来传递这些数据, 你能帮帮我吗?
编辑 我尝试使用委托但没有成功,委托没有被调用。 这是我的委托代码:
设置委托(ViewControllerB)
@class SearchGardenTable;
@protocol SearchGardenDelegate <NSObject>
- (void)addItemViewController:(SearchGardenTable *)controller didFinishWithGardenID:(NSString *)gardenID gardenName:(NSString*)gardenName andCityName:(NSString*)cityName;
@end
@interface SearchGardenTable : UITableViewController
@property (nonatomic, weak) id <SearchGardenDelegate> delegate;
@end
告诉 VC B VC A 是它的代表:
self.searchGarden.delegate = self; // in VC A viewDidLoad.
设置我想从 VC B 传回 VC A 的参数:
_kidGaedenID = [temp objectAtIndex:indexPath.row];
_kidGardenName = [temp1 objectAtIndex:indexPath.row];
[self.delegate addItemViewController:self didFinishWithGardenID:_kidGaedenID gardenName:_kidGardenName andCityName:_kidCityName];
在VC A实现协议方法:
- (void)addItemViewController:(SearchGardenTable *)controller didFinishWithGardenID:(NSString *)gardenID gardenName:(NSString*)gardenName andCityName:(NSString*)cityName
_kidGardenID = gardenID;
_gardenName.text = gardenName;
_kidCity.text = cityName;
【问题讨论】:
【参考方案1】:您可以尝试 willDismissCompletionHandler 代替。这是在 MZFormSheetController.h 文件中定义的。将参数presentedViewController 输入到您的视图控制器(我假设为AddKid),您可以在此处访问AddKit 类的属性。
@property (nonatomic, copy) MZFormSheetCompletionHandler willDismissCompletionHandler;
formsheet.willDismissCompletionHandler = ^(UIViewController *presentedViewController)
((AddKid*)presentedViewController).kidGardenID // should be accessible now.
;
【讨论】:
由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[MZNavigationView KidGaedenID]:无法识别的选择器发送到实例 0x10e1907f0”【参考方案2】:为了将详细信息传递回您的父视图控制器,您应该设置一个委托协议,该协议将完全允许您正在寻找什么。
如果您之前没有创建过任何委托协议,那么一旦您阅读了本教程并使用了几次,您就会发现您经常使用它。
有很多很好的教程,虽然这里是一个很好的起点
Create your own Objective-C Delegate Protocol
希望对你有帮助
【讨论】:
以上是关于如何将表单 FormSeetController 中的数据传递给 ViewController?的主要内容,如果未能解决你的问题,请参考以下文章
Zeppelin 动态表单:如何将变量传递给动态表单——或者——重用动态表单