【问题标题】:performSegue:withSender: sender objectperformSegue:withSender: 发送者对象
【发布时间】:2013-07-08 02:35:26
【问题描述】:

只是想知道发送者对象。

我知道你可以在方法prepareForSegue... 中访问它,但它在下一个destinationViewController 中是否可用?

即在viewDidLoad 中我可以访问segueSender 对象吗?

我从未在文档中看到过这个,我只是认为它可能有用。

为清晰而编辑

我不是在问如何执行转场或找到转场或类似的东西。

假设我有两个视图控制器(VCA 和 VCB)。

有一个从 VCA 到 VCB 的 segue,标识符为“segue”。

在 VCA 中我运行...

[self performSegueWithIdentifier:@"segue" sender:@"Hello world"];

我的问题是我可以从 VCB 访问 @"Hello world" 字符串还是仅在 VCA 内的 prepareForSegue... 方法中可用?

即我可以从目标控制器访问 segue 发送者对象吗?

【问题讨论】:

  • 你可以用来从故事板 UIStoryboard *iPhoneStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:nil] 中获取视图控制器对象; ViewController *firstViewController = [iPhoneStoryboard instantiateViewControllerWithIdentifier:@"FirstViewController"];
  • ??你读过这个问题吗?
  • 你必须在视图加载时访问目标视图控制器吗?
  • 不,我问是否可以访问destinationViewController 中发送到performSegueWithIdentifier:sender: 方法的sender 对象。
  • 是的,你在 prepareForSegue 方法中获取了发送者对象

标签: ios objective-c uistoryboardsegue


【解决方案1】:

是的,你可以。

老问题,但我会用 swift 弹出答案

你先打电话

performSegueWithIdentifier("<#your segue identifier #>", sender: <#your object you wish to access in next viewController #>)

在prepareForSegue中

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

        let dest = segue.destinationViewController as! <# your destination vc #>
        dest.<# sentThroughObject #>  = sender
    }
}

然后在 vc 中你继续拥有一个 var 来接受传递的对象

class NextViewController: UIViewController {

    var <# sentThroughObject #> = AnyObject!()

 //cast <# sentThroughObject #> as! <#your object#> to use
}   

更新:SWIFT 3

performSegue(withIdentifier: "<#your segue identifier #>", sender: <#Object you wish to send to next VC#>)


override func prepare(for segue: NSStoryboardSegue, sender: Any?) {
        let destination = segue.destinationController as! <# cast to your destination VC #>
        destination.sentViaSegueObject = sender as? <#your object#> 
    }

在目标 VC 中有一个属性来接受发送的对象

 var sentViaSegueObject = <#your object#>?

【讨论】:

  • 我不确定为什么选择的答案是非答案 @Fogmeister ?这里有几个正确的答案(如将数据传递给目标控制器)。我要评论的这个是最新和最完整的。
【解决方案2】:

您总是可以从 Storbyoard 获得 segue,并获得 sourceViewController。像这样的:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"myStorboard" bundle:nil];
UIStoryboardSegue *mySegue = [storyboard instantiateViewControllerWithIdentifier:@"mySegue"];
[mySegue sourceViewController]; 

编辑: 评论打败了我。 ;)

【讨论】:

  • 好的,但是在 viewController 的代码中我可以运行这行代码...[self performaSegueWithIdentifier:@"SomeIdentifier" sender:someObject];。我的问题不是如何访问 segue 或如何执行 segue。我的问题很简单,someObject 在destinationViewController 中是否可用。
  • 好吧,您可以在执行 segue 之前将 senderobject 设置为 destinationViewController(或源)的属性。要让一种方法获得一个转场的发送者,我认为问题在于一个转场具有一个标识符,可以使用不同的发送者多次执行,因此很难在destinationViewController中识别转场的正确实例,因此很难找到合适的发件人。另外,请参见此处:stackoverflow.com/questions/14964487/…
【解决方案3】:

如果您尝试将对象从一个视图控制器传递到下一个视图控制器,您可能需要执行以下操作:

在您的父视图控制器中:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    // Only if you have multiple segues.
    if ([segue.identifier isEqualToString:@"NameOfYourSegue"]) {
        // Cast necessary to access properties of the destination view controller.
        [(YourChildViewController *)segue.destinationViewController setObject:theObjectToPass];
    }
}

您需要在情节提要中为您的 segue 命名,并为对象声明一个属性以传递到目标视图控制器。

【讨论】:

  • 谢谢,是的,我知道这一点,我只是不确定目标视图控制器中是否有发送者对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-14
  • 1970-01-01
  • 1970-01-01
  • 2010-12-04
  • 2010-11-21
相关资源
最近更新 更多