使用Obj.C中的属性将数据传递到对象

时间:2013-10-31 16:06:38

标签: ios objective-c properties

我很难理解父母和孩子之间的沟通方式(以及他们如何将数据传递给彼此)。我有两个简单的对象(两个ViewControllers)。我知道父子关系应该允许我使用属性将子对象中的两个变量传递给父对象。因为我包括了Obj。 B进入Obj A我假设A是父,B是孩子。我也明白,孩子知道父母但反之亦然,这是正确的吗?

我包括了Obj。 B进入Obj。 A和我希望能够访问我在Obj的头文件中声明的一些变量。乙

有人可以给我一个非常简单的例子并帮助我结束我的困惑吗?非常感谢。

6 个答案:

答案 0 :(得分:1)

我认为你已经倒退了。父母应该知道孩子。孩子不应该知道其父母。

父母可以强烈引用其子女。 (例如)

//inside the parent class
@property (nonatomic, strong) id childObject;

孩子通常不会明确知道它的“父母”是什么,但它会对代表有一个弱引用。该委托可以是特定类型的类,也可以是符合特定协议的类型id的泛型类。 (例如)

//inside the child class
@property (nonatomic, weak) id<SomeProtocol> delegate;

答案 1 :(得分:1)

要将数据(对象或值)从ViewControllerB推送或呈现ViewControllers传递给ViewControllerA,您需要执行以下操作:

(例如,将NSString从ViewControllerB传递给ViewControllerA

在没有故事板的情况下向前传递数据:

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内,您需要在.h上加@property,如:

@property (nonatomic, strong) NSString *aString;

在.m内,您可以检索此@property

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    NSLog(@"%@", _aString);
}

这是一个NSString的示例,但您可以传递任何对象。

答案 2 :(得分:0)

您可以在其中一个对象中使用弱分配设置循环引用:

ObjectA.h

@class ObjectB
@interface ObjectA
@property (strong) ObjectB *parent;
@end

ObjectA.m

#import "ObjectA.h"
#import "ObjectB.h"
@implementation ObjectA
// methods
@end

ObjectB.h

@class ObjectA
@interface ObjectB
@property (weak) ObjectA *child;
@end

ObjectB.m

#import "ObjectB.h"
#import "ObjectA.h"
@implementation ObjectB
// methods
@end

答案 3 :(得分:0)

创建自定义委托并将消息从一个类发送到另一个类。这样行为将是一个类将发送者和其他将接收。供参考,请按照: -

iOS Protocol / Delegate confusion?

答案 4 :(得分:0)

我认为这不是一个好的编程风格,但您可以使用单例在不同的类之间共享数据

喜欢那样: Singleton.h

@interface Settings : NSObject
@property (nonatomic) NSString *mySharedString;
+ (Settings *)my;
- (id)init;
@end

Singleton.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

答案 5 :(得分:0)

您负责在视图控制器之间传递数据。您可以使用-parentViewController-childViewControllers,也可以使用weak引用进行循环引用。

如果您使用的是故事板,那么最好先看一下-performSegueWithIdentifier:sender:。发件人可用于在视图控制器之间传递数据。

此外,如果您使用的是故事板,有时候- instantiateViewControllerWithIdentifier:就是方便的事。

有多种方法可以做到这一点。