dismissModalViewController并传回数据

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (149)

我有两个视图控制器,firstViewControllersecondViewController。我正在使用此代码切换到我的secondViewController(我也传递一个字符串):

secondViewController *second = [[secondViewController alloc] initWithNibName:nil bundle:nil];

second.myString = @"This text is passed from firstViewController!";

second.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;

[self presentModalViewController:second animated:YES];

[second release];

然后,我在secondViewController中使用此代码切换回firstViewController:

[self dismissModalViewControllerAnimated:YES];

所有这些工作正常。我的问题是,我将如何将数据传递给firstViewController?我想从secondViewController传递一个不同的字符串到firstViewController中。

提问于
用户回答回答于

你需要使用委托协议...以下是如何做到这一点:

在secondViewController的头文件中声明一个协议。它应该是这样的:

#import <UIKit/UIKit.h>

@protocol SecondDelegate <NSObject>
-(void)secondViewControllerDismissed:(NSString *)stringForFirst
@end


@interface SecondViewController : UIViewController
{
    id myDelegate;  
}

@property (nonatomic, assign) id<SecondDelegate>    myDelegate;

不要忘记在你的实现(SecondViewController.m)文件中综合myDelegate:

@synthesize myDelegate;

在你的FirstViewController的头文件中,通过执行以下操作订阅SecondDelegate协议:

#import "SecondViewController.h"

@interface FirstViewController:UIViewController <SecondDelegate>

现在,当您在FirstViewController中实例化SecondViewController时,您应该执行以下操作:

// If you're using a view controller built with Interface Builder.
SecondViewController *second = [[SecondViewController alloc] initWithNibName:"SecondViewController" bundle:[NSBundle mainBundle]];
// If you're using a view controller built programmatically.
SecondViewController *second = [SecondViewController new]; // Convenience initializer that uses alloc] init]
second.myString = @"This text is passed from firstViewController!";
second.myDelegate = self;
second.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
[self presentModalViewController:second animated:YES];
[second release];

最后,在你的第一个视图控制器(FirstViewController.m)的实现文件中实现SecondViewControllerDismissed的SecondDelegate方法:

- (void)secondViewControllerDismissed:(NSString *)stringForFirst
{
    NSString *thisIsTheDesiredString = stringForFirst; //And there you have it.....
}

现在,当您即将关闭第二个视图控制器时,您想要调用在第一个视图控制器中实现的方法。这部分很简单。你所做的只是在你的第二个视图控制器中,在解除代码之前添加一些代码:

if([self.myDelegate respondsToSelector:@selector(secondViewControllerDismissed:)])
{
    [self.myDelegate secondViewControllerDismissed:@"THIS IS THE STRING TO SEND!!!"];
}
[self dismissModalViewControllerAnimated:YES];

如果你想传递多个参数,解除前的代码如下所示:

if([self.myDelegate respondsToSelector:@selector(secondViewControllerDismissed:argument2:argument3:)])
{
    [self.myDelegate secondViewControllerDismissed:@"THIS IS THE STRING TO SEND!!!" argument2:someObject argument3:anotherObject];
}
[self dismissModalViewControllerAnimated:YES];

这意味着您的firstViewController中的SecondDelegate方法实现现在看起来像这样:

- (void) secondViewControllerDismissed:(NSString*)stringForFirst argument2:(NSObject*)inObject1 argument3:(NSObject*)inObject2
{
    NSString thisIsTheDesiredString = stringForFirst;
    NSObject desiredObject1 = inObject1;
    //....and so on
}
用户回答回答于

我可能在这里不合适,但是我开始更喜欢块语法来使用非常冗长的委托/协议方法。如果您从vc1制作vc2,请在vc2上拥有一个属性,您可以从vc1中设置该属性!

@property (nonatomic, copy) void (^somethingHappenedInVC2)(NSString *response);

然后,当你想告诉vc1 vc2中发生什么事时,只需执行你在vc1中定义的块!

self.somethingHappenedInVC2(@"Hello!");

这使您可以将数据从vc2发送回vc1。就像魔术一样。海事组织,这比协议更容易/更清洁。积木很棒,需要尽可能地拥抱。

假设我们有一个mainVC,我们希望暂时提供一个modalVC来获得用户的一些输入。为了从mainVC中呈现modalVC,我们需要在mainVC中分配/初始化它。很基本的东西。那么当我们创建这个modalVC对象时,我们也可以在其上设置一个block属性,这使得我们可以轻松地在两个vc对象之间进行通信。所以让我们从上面的例子中,将follwing属性放在modalVC的.h文件中:

 @property (nonatomic, copy) void (^somethingHappenedInModalVC)(NSString *response);  

然后,在我们的mainVC中,在alloc / init了一个新的模态VC对象后,你可以像这样设置modalVC的block属性:

ModalVC *modalVC = [[ModalVC alloc] init];
modalVC.somethingHappenedInModalVC = ^(NSString *response) {
     NSLog(@"Something was selected in the modalVC, and this is what it was:%@", response);
}

所以我们只是设置block属性,并且定义在执行该块时会发生什么。

最后,在我们的modalVC中,我们可以有一个由dataSource数组的字符串支持的tableViewController。一旦选择行,我们可以做这样的事情:

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
      NSString *selectedString = self.dataSource[indexPath.row];
      self.somethingHappenedInModalVC(selectedString);
 }

所属标签

可能回答问题的人

  • 人生的旅途

    10 粉丝484 提问5 回答
  • 无聊至极

    4 粉丝504 提问5 回答
  • 富有想象力的人

    4 粉丝0 提问4 回答
  • 嗨喽你好

    7 粉丝480 提问4 回答

扫码关注云+社区

领取腾讯云代金券