gpt4 book ai didi

objective-c - 使用最简单的方法将数据(字符串)从子 VC 传递到父 VC

转载 作者:行者123 更新时间:2023-12-01 17:58:17 28 4
gpt4 key购买 nike

使用最简单的方式将数据(字符串)从 subview Controller 传递到父 VC。
我尝试了几种方法,但迷路了,谁能告诉我最好的方法。

最佳答案

斯里坎特是正确的。如果你有一个从 View Controller (我们的“第一个” View Controller )到另一个(我们的“第二个” View Controller )的 segue,那么您需要做的就是在第二个 View Controller 中创建一个指向第一个 View Controller 的属性。您只需让第一个 View Controller 确保在它执行转换之前设置该指针。完成后,第二个 Controller 可以更新属性或调用第一个 Controller 的方法。

详情见Configuring the Destination Controller When a Segue is Triggered在 View Controller Programming Guide 中了解如何在第二个 View Controller 中设置属性(在这种情况下,该属性将是指向第一个 Controller 的弱指针)在 prepareForSegue .然后,正如 Srikanth 所说,第二个 Controller 可以使用该指针来更新第一个 Controller 中的属性。

因此,在您的第二个 View Controller 中,有一个属性(请注意,它应该是 weak )指向第一个 View Controller :

在 SecondViewController.h 中:

@class FirstViewController;

@interface SecondViewController : UIViewController

@property (nonatomic, weak) FirstViewController *firstViewController;

@end

然后在 FirstViewController.m 中:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:@"YourSegueIdentifierHere"])
{
[segue.destinationViewController setFirstViewController:self];
}
}

所以,如果你的第一个 View Controller 有一个属性 favoriteColor :
@interface FirstViewController : UIViewController

@property (nonatomic, strong) NSString *favoriteColor;

@end

然后,第二个 View Controller 可以使用它的 firstViewController属性来更新 favoriteColor ,像这样:
self.firstViewController.favoriteColor = @"Blue";

清楚地:
  • 替换 FirstViewControllerSecondViewController具有适当的类名;
  • 确保您的第二个 View Controller 的 .m 文件执行 #import第一个 View Controller 的.h;和
  • 确保在 Interface Builder 中为从第一个 Controller 到第二个 Controller 的 segue 指定了一个 segue 标识符,并调整 prepareForSegue上面,替换YourSegueIdentifierHere与您的标识符。


  • 在 iOS 6 中,您还可以通过 unwind segue 来完成此操作。你只需要 prepareForSegue第二个 View Controller 的更新 unwind segue 的目标 Controller (即第一个 Controller )的属性。好的是展开转场可以返回任意数量的关卡,所以对于更复杂的场景,它非常好。不过,它只是 iOS 6 或更高版本。

    要进行 unwind segue,首先必须在第一个 View Controller 中定义一个 unwind Action (通过 IBAction 返回类型和 UIStoryboardSegue 参数的组合来识别),例如:
    - (IBAction)done:(UIStoryboardSegue *)segue
    {
    // do any clean up you want
    }

    然后,第二个(或第三个或...) View Controller 可以通过在 Interface Builder 中从按钮拖动到场景 Dock 中的退出图标来创建展开转场。您可以让要从中展开的 Controller 执行逻辑 prepareForSegue将信息传递回第一个 View Controller 。

    顺便说一句,您使用了术语“ parent ”和“ child ”,但我想澄清一下,我假设您不是在谈论更高级的话题 view controller containment ,其中 View Controller 正在调用其他 View Controller 以促进单个屏幕信息的呈现(而不是在应用程序中的不同场景之间转换)。正如 rdelmar 在我们下面的评论中指出的那样,严格来说,术语“父”和“子” Controller 更恰本地暗示了一个正在使用 View Controller 包含。

    显然,如果您使用的是 View Controller 包含,那么显然是关于 segues 的讨论, prepareForSegue等,不适用。此外,正确实现的容器 View Controller 保证子 Controller 实际上可以使用 UIViewController parentViewController 的属性(property),而不需要定义我们自己的属性来引用父级。您需要做的就是转换/定义 parentViewController成为正确的子类,然后您可以非常轻松地访问您的子类属性。

    关于objective-c - 使用最简单的方法将数据(字符串)从子 VC 传递到父 VC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13829151/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com