2014-02-28 64 views
0

兩個屬性:屬性是空的viewDidLoad之外

@property (retain, nonatomic) NSString *drinkType; 
@property (retain, nonatomic) NSString *wheelType; 

當從viewDidLoad中爲self.drinkType等訪問,他們持有我所期望的價值。但是,從公共方法訪問時

-(void)updateSentenceWithSelectedAromas:(NSMutableArray *)selectedAromas; 

它們爲空。這裏發生了什麼?

「selectedAromas」數組從另一個控制器傳遞到此方法。

ViewController *aromaVC = [[ViewController alloc] init]; 
[aromaVC updateSentenceWithSelectedAromas:selectedAromas]; 

ViewController.h

-(void)updateSentenceWithSelectedAromas:(NSMutableArray *)selectedAromas; 

@property (retain, nonatomic) NSString *drinkType; 
@property (retain, nonatomic) NSString *wheelType; 

ViewController.m

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    // This is working 
    NSLog(@"The drink type is:%@", self.drinkType); 
} 

-(void)updateSentenceWithSelectedAromas:(NSMutableArray *)selectedAromas { 

    // This returns null 
    NSLog(@"The drink type is:%@", self.drinkType); 
} 
+1

我敢打賭,你正在實例化一個喲你的視圖控制器來自一個XIB或故事板,然後你正在實例化你的視圖控制器的另一個獨立版本。每次嘗試引用「'drinkType」「或」'wheelType「時,請檢查以確保您的視圖控制器地址相同。 –

+0

我認爲你需要分享更多的代碼來診斷問題 – Merlevede

+0

我認爲你需要非常仔細地聆聽@MichaelDautermann告訴你的內容。 – matt

回答

0

好的,Michael Dautermann是絕對正確的。實際上,方法updateSentenceWithSelectedAromas在視圖控制器的單獨實例中運行。爲了解決這個問題,我使用我的方法實現了一個協議偵聽器,並使用segue將子控制器的委託設置爲其父項。

謝謝大家的一切幫助。

萬一有人絆倒在此,這裏是我做過什麼:

ViewController2.h

@protocol updateSentenceProtocol <NSObject> 

//Send Data Back To ViewController 
-(void)updateSentenceWithSelectedAromas:(NSMutableArray *)selectedAromas; 

@end 

@interface ViewController2 : UIViewController 

// delegate so we can pass data to previous controller 
@property(nonatomic,assign)id delegate; 

@end 

ViewController2.m

@synthesize delegate; 

-(void)someMethod { 
    [delegate updateSentenceWithSelectedAromas:selectedAromas]; 
} 

ViewController.m

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([[segue identifier] isEqualToString:@"viewController2Segue"]) 
    { 
     // Get reference to the destination view controller 
     ViewController2 *vc = [segue destinationViewController]; 
     vc.delegate = self; 
    } 
} 

-(void)updateSentenceWithSelectedAromas:(NSMutableArray *)selectedAromas { 
    // do stuff with array and properties as needed 
} 
0

我認爲你缺少不少東西,這使我認爲你缺少一些基本的瞭解ObjectiveC中的可變範圍,讓我們來看看這是否有助於你:

首先,你的selectedAromas數組與drinkTypewheelType沒有任何關係。所以將這個數組傳遞給ViewController看起來並不重要。其次,在你的ViewController中,你聲明瞭你自己的drinkTypewheelType變量,所以他們沒有辦法獲得其他類或者控制器的價值。

0

你可能沒有儘快設置你的屬性(init會是一個好地方)。相對於您發佈的代碼,viewDidLoad會稍後調用。

相關問題