【问题标题】:How to send back data and response from second view controller to the first one using uinavigationcontroller如何使用 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 中的视图控制器是如何工作的

标签: ios objective-c


【解决方案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];

}

示例代码:

  1. 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 发现您不需要声誉点... .我已经问过相关问题,但你没有回答。请考虑以上评论并回复。
  • 没问题。我在同一个答案中添加了您第二个问题的答案。请再次检查。
猜你喜欢
  • 2016-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-05
  • 1970-01-01
  • 1970-01-01
  • 2020-12-26
  • 1970-01-01
相关资源
最近更新 更多