如何使用Swift语言将数据从弹出的模型视图控制器传递到以前的视图控制器?

时间:2015-06-09 06:33:12

标签: ios objective-c block

我知道我们可以使用模型segue presentViewController切换到VC1到VC2。 我们可以使用segue在prepareForSegue方法中将数据从VC1传递到VC2,如下所示:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    var vc2: VC2ViewController = segue.destinationViewController as! VC2ViewController
    vc2.desiredData = "The data wanted by VC2"
}

但是,在使用dismissViewContoller时,如何从VC2将数据重新传递回VC1? 我知道我们可以在Objective-C中使用块,例如:

// VC1.h file:
typedef void(^SelectedCity)(NSString *);
@property (copy, nonatomic) SelectedCity selectedCity;

// VC1.m file:
__weak VC1ViewController *weakVC1 = self;
_selectedCity = ^(NSString *city) {
    weakVC1.cityLabel.text = "city";
}

// VC2.h file:
typedef void(^SelectedCity)(NSString *);
@property (copy, nonatomic) SelectedCity selectedCity;

// VC2.m file:
if (_selectedCity) {
    _selectedCity(cell.textLabel.text); //get the city from tableView cell
}

情况是:我从VC2的tableView单元格中选择城市,然后在VC1中获得相同的城市值。

但是,我对这块感到困惑。我们怎样才能传递数据呢?在整个项目中,整个项目似乎是一种隧道吗?然后我们可以从一侧传递数据,并在另一侧获取数据。

之前是我对该块的理解。它是否正确? 顺便说一句,如何在swift中使用块?非常感谢。

3 个答案:

答案 0 :(得分:2)

我知道3种方法可以将数据传回上一个viewcontroller。

  1. NSNotification - 当您正在播放时。当必须在几个类(注册通知的类)中达到调用时使用它。关系 - 一对多。建议你让代表弱势。在您的情况下不推荐。

  2. 代表 - 协议投诉代表用于一对一的通信。它们基于obj-c / swift,最适合任何数据量。它们和Block / Closures一样快。关系 - 一对一。建议您制作块复制类型。 here is the example

  3. 阻止/关闭 - 阻止速度很快。它们是通过C API编写的包装器。虽然他们的语法是随意的。块像变量一样使用。它们包含您希望在以后执行的代码段(可能来自另一个类)。 Blocks创建在其中编写的代码语句的副本,包括引用。 here is the examplehere

答案 1 :(得分:1)

要在视图控制器之间传递数据,您还可以使用NSNotification。

对于Ex: 在VC1中添加通知观察者

- (void)viewDidLoad {
     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(rcvData:) name:@"passData" object:nil];
}

- (void)rcvData:(NSNotification*)notification {
    NSLog(@"%@",notification.object);
}

从VC2发布通知

NSString *name = @"xyz";
[[NSNotificationCenter defaultCenter] postNotificationName:@"passData" object:name userInfo:nil];

数据将以- rcvData:方法

传递给VC1

答案 2 :(得分:0)

在Protocol中声明你的方法。 并使用委托调用您的方法。