如何使用 uinavigationcontroller 将数据和响应从第二个视图控制器发送回第一个视图控制器

Posted

技术标签:

【中文标题】如何使用 uinavigationcontroller 将数据和响应从第二个视图控制器发送回第一个视图控制器【英文标题】:How to send back data and response from second view controller to the first one using uinavigationcontroller 【发布时间】:2015-01-19 09:34:33 【问题描述】:

我的问题是如何使用 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];


//--------------------------------------------- ---------

有什么想法吗? 我正在以编程方式完成所有事情,而不是使用任何故事板。

【问题讨论】:

根据您的要求使用 getter 和 setter 方法在 Data Manager 类上创建 这很容易做到。在第一个控制器中定义一个公共方法,并在第二个控制器中调用它。或者委托、通知、键值观察等。非常简单。 我认为这不是正确的方法,委托和协议应该完成这项工作。我想知道为什么控制没有回到 firstviewcontroller - (void)detailsViewControllerDidCancel:(DetailsViewController *)controller 或 - (void)detailsViewControllerDidSave:(DetailsViewController *)controller @wcd 对不起,我没能找到你。我如何在 child.in 中实例化父类。在您的情况下,我认为 Parent 创建了子类。 .孩子将创建父母。 在我看来您误解了UINavigationController 的用法。你使用了dismissViewControllerAnimated。此方法用于关闭以模态方式呈现其视图的视图控制器。也许您需要阅读以下文档:developer.apple.com/library/ios/featuredarticles/… 以了解 iOS 中的视图控制器是如何工作的 【参考方案1】:

您需要了解作为参数从 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];


示例代码:

    How do I set up a simple delegate to communicate between two view controllers?

如果您想以数组形式发送,请执行以下操作,

父视图控制器 - (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

【讨论】:

非常感谢。 . .它工作得很好。 .还有一个问题,我对 iOS 完全陌生 - (void)save:(id)sender if (self.delegate && [self.delegate respondsToSelector:@selector(detailsViewControllerDidSave:version:company:)]) [self.delegate respondsToSelector:@selector(detailsViewControllerDidSave:version:company:)])委托 detailsViewControllerDidSave:nameTextField.text version:versionTextfield.text company:companyTextfield.text];我想发送数组而不是 nametextfield 。 . . 请投票。如果你对我的回答满意:) 我不需要声望点来投票给你。 . .我已经尝试过了,但是 msg 发现您不需要声誉点... .我已经问过相关问题,但你没有回答。请考虑以上评论并回复。 没问题。我在同一个答案中添加了您第二个问题的答案。请再次检查。

以上是关于如何使用 uinavigationcontroller 将数据和响应从第二个视图控制器发送回第一个视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

如何在 UINavigationController 堆栈中使用 didReceiveMemoryWarning

iOS:如何在现有 UINavigationController 中打开另一个 UINavigationController?

如何使用 uinavigationcontroller

如何使用当前视图信息自定义 UINavigationController 的顶部栏?

如何在 UINavigationController 中使用协议和委托

使用后如何在堆栈中删除 UINavigationController 的第一个视图?