使用最简单的方式将数据(字符串)从子视图控制器传递到父VC。 我尝试了几种方法,但迷路了,有人能告诉我最好的方法。使用最简单的方法从子VC向父VC传递数据(字符串)
回答
Srikanth是正确的。如果你有一个从视图控制器(我们的“第一个”视图控制器)到另一个视图控制器(我们的“第二个”视图控制器),你需要做的是在第二个指向第一个的属性中创建一个属性。您只需让第一个视图控制器确保在执行转换之前设置该指针。完成之后,第二个控制器可以更新属性或调用第一个控制器的方法。
有关详情,以了解如何在第二个视图控制器设置属性信息的视图控制器编程指南在看到Configuring the Destination Controller When a Segue is Triggered(在这种情况下,该属性将是一个弱指针到第一控制器)中prepareForSegue
。然后,正如Srikanth所说,第二个控制器可以使用该指针更新第一个属性。
所以,在你的第二个视图控制器,有一个属性(仔细注意,它应该是weak
)指回第一个视图控制器:
在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];
}
}
所以,如果你的第一个视图控制器有,例如,favoriteColor
属性:
@interface FirstViewController : UIViewController
@property (nonatomic, strong) NSString *favoriteColor;
@end
然后,第二视图控制器可以利用其firstViewController
属性来更新这favoriteColor
,像这样:
self.firstViewController.favoriteColor = @"Blue";
显然:
与适当的类替换
FirstViewController
和SecondViewController
名称;确保您的第二个视图控制器的.m文件执行第一个视图控制器的.h文件的
#import
;和确保您已在Interface Builder中为第一个控制器指定了一个segue标识符,然后调整上面的
prepareForSegue
,用您的标识符替换YourSegueIdentifierHere
。
在iOS 6中,您还可以通过回卷SEGUE做到这一点。您只需让第二个视图控制器的prepareForSegue
更新unwind segue的目标控制器(即第一个控制器)的属性。不错的是,放松赛段可以回到任意数量的级别,所以对于更复杂的场景,这是非常好的。不过,它只是iOS 6或更高版本。
要执行退绕SEGUE的,首先必须(通过IBAction
返回类型的组合和UIStoryboardSegue
参数确定为这样)限定在所述第一视图控制器退绕动作,例如:
- (IBAction)done:(UIStoryboardSegue *)segue
{
// do any clean up you want
}
然后,第二个(或第三个或...)视图控制器可以通过控制创建展开顺序 - 在界面构建器中从按钮拖动到场景底座中的退出图标。您可以让您从中退出的控制器执行逻辑prepareForSegue
以将信息传递回第一个视图控制器。
顺便问一下,你所使用的术语“家长”和“孩子”,但我想说清楚,我以为你不是在谈论的view controller containment更高级的话题,其中一个视图控制器正在调用其他视图控制器以便于呈现单个屏幕的信息(而不是在应用中的不同场景之间进行转换)。正如rdelmar在我们下面的评论中指出的那样,严格来说,术语“父”和“子”控制器更恰当地暗示着使用视图控制器控制。
显然,如果您使用视图控制器遏制,那么明确讨论segues,prepareForSegue
等,不适用。此外,正确实施的容器视图控制器保证子控制器实际上可以使用parentViewController
的属性,而无需定义我们自己的属性来引用父项。您只需要将parentViewController
投射/定义为正确的子类,然后就可以非常轻松地访问您的子类。
没有必要创建一个属性,孩子已经拥有了属性parentViewController,它将指向父级。 – rdelmar
@rdelmar我不认为你的意思是'parentViewController',因为这给你视图控制器遏制的父母。例如,如果你正在做模态转换,你可以使用'presentationViewController',但根据我的经验,如果你正在做模态转换的视图控制器本身就嵌入在导航控制器中,那么即使这样也行不通。如果你正在进行push segges,那么'parentViewController'和'presentingViewController'都不能工作。 (叹气。)这就是为什么我自己指定了“parent”(为什么我没有把它叫做'parentViewController',以避免混淆)。 – Rob
是的,我的意思是parentViewController,因为问题具体询问父子关系。现在,OP很可能错误地使用了这个术语,在这种情况下,你的方式是必要的(也是更一般的)。 – rdelmar
最好的方法是在类型为id或UIViewController的子视图控制器中拥有一个属性。在创建子项时将该值设置为父视图控制器。
一旦你有权访问子视图控制器中的父视图控制器,你可以访问它的方法或属性。
你能否给我提供一些教程链接或任何东西。 –
@AkshatAnil:我真的怀疑这个教程的具体内容是“将一个数据从一个子视图控制器传递给父视图控制器。你不知道如何创建属性或者什么? – Chuck
是的,在我的情况下没有工作的原因,我试图使用协议和委托。 –
- 1. 将数据从VC传递到VC segue
- 2. 从Marker向其他VC传递数据
- 3. 无法从非父VC更新嵌入式子VC VC
- 4. 使用段将子数据视图控制器中的数据(字符串)传递给父VC
- 5. 什么是无数据传递给VC的最有效和最简单的方法?
- 6. 无法将NSString从一个VC传递到下一个VC
- 7. VC之间的快速传递数据
- 8. 将数据从Child Modal VC传递到父视图控制器的最佳方法?
- 9. 如何将数据从VC传递到单元?
- 10. 传递数据VC代表iOS
- 11. VC++ - 字符串和BSTR
- 12. 加载XML值,并将其传递到字符串在VC++
- 13. 如何通过csharp程序将字符串传递给vC++ dll
- 14. 从VC++ 2005向VC++ 6传递std :: string DLL导致垃圾回收
- 15. VC#2017年的RC和VC#2008的连接字符串错误
- 16. 在VC++ SDI应用程序中函数之间传递的字符串
- 17. VC++ 6.0(或VC++ 2008)的简短枚举?
- 18. 将结构从VC++传递到C#
- 19. IOS:以编程方式将数据传递给VC
- 20. 使用字体从字符串中获取像素数据的简单方法
- 21. 最简单的方法来替换子字符串
- 22. 奇怪的字符串在执行VC++
- 23. Swift:如何将数据从TableViewController传递到Details VC
- 24. 将数据结构从VC++传递到C#?
- 25. 如何调用C#委托从本地C传递字符串数组最简单的方法?
- 26. 从RS-232端口读取字符串的最简单方法?
- 27. 如何在swift4中获取子字符串并使用最简单的方法?
- 28. 如何在vC++中分割字符串?
- 29. 从VC
- 30. 如何将数据从父视图控制器多次传递给Swift中的Container VC子项?
“最简单的方法” - 我建议使用Objective-C消息发送。 – 2012-12-11 21:56:42