2013-10-31 74 views
0

我很難理解父母和孩子如何溝通(以及他們如何將數據傳遞給對方)。我有兩個簡單的對象(兩個ViewControllers)。我明白,父子關係應該允許我使用屬性將兩個變量從子對象傳遞到父對象。因爲我包括Obj。 B到Obj A我假設A是父母,B是孩子。我也明白,孩子知道父母,但反之亦然,這是正確的嗎?使用Obj.C中的屬性將數據傳遞給對象

我收錄了Obj。 B進入Obj。 A和我希望能夠訪問我在Obj的頭文件中聲明的一些變量。 B

有人能給我一個非常簡單的例子,並幫助我結束我的困惑嗎?非常感謝。

+0

要將數據從A傳遞給B,您可以輕鬆使用'property'。要訪問從B到A的數據,你可以看一下'protocol'。 告訴我們,如果你使用故事板或不使用屬性 –

+2

通過數據你是什麼意思的「親子關係」? – dasblinkenlight

+0

@JordanMontel,現在我只是試圖將兩個變量從A傳遞給B.我明白從B到A我需要使用協議。但我很難理解誰需要這些屬性。 B能夠訪問A的屬性,反之亦然? – Nactus

回答

1

要從ViewControllerA直傳數據(對象或值)爲ViewControllerB推或呈現ViewControllers,你需要做的是這樣的:

(例如,通過一個的NSString一個ViewControllerBViewControllerA

向前傳遞數據,而無需故事板:

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的例子,但你可以傳遞任何對象克拉。

+0

謝謝喬丹,upvoted。所有的答案都是信息,但我正在尋找這樣的事情,所以我會接受這個答案。謝謝。 – Nactus

+0

不客氣:) –

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 
0

創建自定義委託並將消息從一個類發送到另一個類。因此,行爲將是一個類將是發件人和其他將收到。僅供參考遵循此: -

iOS Protocol/Delegate confusion?

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 
+0

謝謝你的單身設計模式。我有點嘗試使用setter和getters在這種情況下D – Nactus

+0

(如果你有屬性NSMutableString),你可以使用 '[Settings my] .mySharedString = @「some text」' 來調用setter和 'NSString * myText = [設置我] .mySharedString' 致電getter – Thorax

1

我想你已經明白了倒退。父母應該知道這個孩子。孩子不需要知道其父母。

家長可以有一個強烈的參考其孩子。 (ex)

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

小孩通常不會明確知道它的「父母」是什麼,但它對代表的參照很弱。該委託可以是特定類型的類,也可以是符合特定協議的類型爲id的泛型類。(EX)

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

感謝Nick,upvoted。因此,代表將用於將數據從孩子傳回給父母,對嗎? – Nactus

+0

這是正確的,是的。 – Nick

0

您負責在視圖控制器之間傳遞數據。您可以使用-parentViewController-childViewControllers,還可以使用weak引用進行循環引用。

如果您使用的故事板,也許這將是看看-performSegueWithIdentifier:sender:一個好主意。發送者可以用來在視圖控制器之間傳遞數據。

此外,如果你使用的是故事板,有時- instantiateViewControllerWithIdentifier:是很方便的事情。

有多種方法可以做到這一點。

相關問題