我很难理解父母和孩子如何交流(以及他们如何相互传递数据)。我有两个简单的对象(两个 ViewControllers)。我知道父子关系应该允许我使用属性将两个变量从子对象传递到父对象。因为我包括了 Obj. B 进入 Obj AI 假设 A 是父母,B 是孩子。我也明白孩子知道父母,但反之不知道,对吗?
我包括了 Obj。B 进入 Obj。A 我希望能够访问我在 Obj 的头文件中声明的一些变量。乙
有人可以给我一个非常简单的例子并帮助我结束我的困惑吗?非常感谢。
我很难理解父母和孩子如何交流(以及他们如何相互传递数据)。我有两个简单的对象(两个 ViewControllers)。我知道父子关系应该允许我使用属性将两个变量从子对象传递到父对象。因为我包括了 Obj. B 进入 Obj AI 假设 A 是父母,B 是孩子。我也明白孩子知道父母,但反之不知道,对吗?
我包括了 Obj。B 进入 Obj。A 我希望能够访问我在 Obj 的头文件中声明的一些变量。乙
有人可以给我一个非常简单的例子并帮助我结束我的困惑吗?非常感谢。
我认为你已经把它弄反了。父母应该知道孩子的情况。孩子不需要知道它的父母。
父级可以对其子级具有强引用。(前任)
//inside the parent class
@property (nonatomic, strong) id childObject;
孩子通常不会明确知道它的“父母”是什么,但它会对委托有弱引用。该委托可以是特定类型的类,也可以是id
符合特定协议的泛型类。(前任)
//inside the child class
@property (nonatomic, weak) id<SomeProtocol> delegate;
要将数据(对象或值)ViewControllerB
从ViewControllerA
推送或呈现 ViewController 转发到 a,您需要执行以下操作:
(例如,将 NSStringViewControllerB
从 a 传递给 a ViewControllerA
)
在没有 Storyboard 的情况下向前传递数据:
ViewControllerB *viewControllerB = [[ViewControllerB alloc] initWithNib:@"ViewControllerB" bundle:nil];
viewControllerB.aString = myString; // myString is the data you want to pass
[self presentViewController:viewControllerB animated:YES completion:nil];
使用UINavigationController
:
ViewControllerB *viewControllerB = [[ViewControllerB alloc] initWithNib:@"ViewControllerB" bundle:nil];
viewControllerB.aString = myString;
[self.navigationController pushViewController:viewControllerB animated:YES];
在里面viewControllerB
,你需要@property
在你的 .h 上有一个像:
@property (nonatomic, strong) NSString *aString;
在你的 .m 中,你检索到这个@property
:
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
NSLog(@"%@", _aString);
}
这是一个使用 NSString 的示例,但您可以传递任何对象。
您可以在其中一个对象中使用弱赋值设置循环引用:
对象A.h
@class ObjectB
@interface ObjectA
@property (strong) ObjectB *parent;
@end
对象A.m
#import "ObjectA.h"
#import "ObjectB.h"
@implementation ObjectA
// methods
@end
对象B.h
@class ObjectA
@interface ObjectB
@property (weak) ObjectA *child;
@end
对象B.m
#import "ObjectB.h"
#import "ObjectA.h"
@implementation ObjectB
// methods
@end
创建自定义委托并将消息从一个类发送到另一个类。这样行为将是一个类将是发送者,另一个将是接收者。参考如下: -
我认为这不是一种好的编程风格,但您可以使用单例在许多不同的类之间共享数据
像这样:Singleton.h
@interface Settings : NSObject
@property (nonatomic) NSString *mySharedString;
+ (Settings *)my;
- (id)init;
@end
单身人士.m
#import "Settings.h"
@implementation Settings
@synthesize mySharedString
static Settings *my = nil;
+ (Settings *)my
{
if (!my)
my = [Settings new];
return my;
}
- (id)init
{
self = [super init];
if (self){
//do some code
}
return self
}
@end
然后在任何课堂上你都可以说类似
NSString *classString = [Settings my].mySharedString
您负责在视图控制器之间传递数据。您可以使用-parentViewController
or -childViewControllers
,也可以使用引用进行循环weak
引用。
如果您正在使用情节提要,那么看看-performSegueWithIdentifier:sender:
. Sender 可用于在视图控制器之间传递数据。
此外,如果您使用情节提要,有时会- instantiateViewControllerWithIdentifier:
很方便。
有不止一种方法可以做到这一点。