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

时间:2015-01-19 09:34:34

标签: ios objective-c

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

}

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

请问有什么想法吗? 我正在以编程方式处理所有事务,而不是使用任何故事板。

1 个答案:

答案 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];

}

示例代码:

  1. How do I set up a simple delegate to communicate between two view controllers?
  2. 如果您想作为数组发送,请执行以下操作

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