如何将表单 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 动态表单:如何将变量传递给动态表单——或者——重用动态表单

Angular 11 ReactiveForm:如何将表单控件更改为表单数组(表单数组内的表单数组)

前端如何将form表单中值转成json字符串?

如何将数据从一个表单发布到另一个 iFrame 表单

当我将表单提交到服务器时,如何检查表单中是不是存在输入字段?