【问题标题】:How to pass data from the popped model view controller to the previous view controller using Swift language?如何使用 Swift 语言将数据从弹出的模型视图控制器传递到前一个视图控制器?
【发布时间】:2015-06-09 06:33:12
【问题描述】:

我知道我们可以使用模型 segue presentViewController 切换到 VC1 到 VC2。 我们可以在prepareForSegue方法中使用segue将数据从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中的block,例如:

// 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中得到了相同的城市值。

但是,我对这个街区感到困惑。我们如何做到这一点来传递数据?在整个项目中,街区似乎是一种隧道吗?然后我们可以从一侧传递数据,从另一侧获取数据。

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

【问题讨论】:

  • 是的,NSNotification 是在 viewController 之间传递数据的好方法。但我仍然想知道该块是如何工作的。谢谢大家。

标签: ios objective-c block


【解决方案1】:

我知道您可以将数据传回之前的视图控制器的 3 种方法。

  1. NSNotification - 当你在广播时。当必须在多个类(注册通知的类)中进行呼叫时使用它。关系 - 一对多。建议您将代表设为弱类型。在您的情况下不推荐。

  2. 代表 - 协议投诉代表用于一对一交流。它们基于 obj-c/swift 并且最适合任何数量的数据。它们不如 Blocks/Closures 快。关系 - 一对一。建议您制作块复制类型。 here is the example

  3. 块/闭包 - 块很快。它们是用 C API 编写的包装器。尽管它们的语法是随意的。块像变量一样使用。它们包含您想要在稍后阶段执行的一段代码(可能来自另一个类)。块创建写入其中的代码语句的副本,包括引用。 here is the examplehere

【讨论】:

    【解决方案2】:

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

    例如: 在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

    【讨论】:

    • 是的,NSNotification 是在 viewController 之间传递数据的好方法。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2017-04-22
      • 2019-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多