2013-10-02 10 views
6

मैं एक से नेविगेशन नियंत्रक में एक ViewController बी पुश करने के लिए कोशिश कर रहा था ViewController धक्का और फिर ए
में बी के कुछ गुण बताए इस मामले में, गुण की बताए किया गया था और उसके बाद ViewController एक की viewDidLoad किया गया था।viewDidLoad धीरे निष्पादित करता है, जबकि

यहां, ए में गुणों को असाइन करने के बाद केवल डी के लोड किए गए लोड के बाद किया जाना चाहिए।

उदाहरण के लिए,

[b.navController pushViewController:a animated:YES]; 
a.status = @"loaded"; 

इधर, स्थिति पहले सौंपा गया था और उसके बाद एक के viewDidLoad मार डाला गया था। यह केवल आईओएस 7 में होता है जबकि आईओएस 6 में यह ठीक काम करता है।

क्या कोई मुझे बता सकता है कि समस्या कहां है?

अद्यतन: आईओएस 7 में कुछ मामलों में मेरे लिए, पुश व्यू काम नहीं कर रहा है। मैं कैसे cna डीबग और इसे ठीक करें?

+0

आप कुछ और कोड दे सकते हैं? ऐसा कुछ और हो सकता है जो viewDidLoad: निष्पादित करने के कारण हो सकता है। – Abhinit

उत्तर

1

ऑलोक इनिट के बाद बस viewcontroller.view (आवंटन के तुरंत बाद किसी भी चीज़ को सेट करें) संपत्ति तक पहुंचें;

जो लोडव्यू/व्यूडिडलोड होगा।
See Apple Documentation

0

तुम्हें पता कर सकते हैं जब एक दृश्य नियंत्रक UINavigationControllerDelegate लागू करने और प्रतिनिधि self.navigationController.delegate = self; रूप में अपने आप को सेट करके ढेर पर धकेल दिया जा चुका है तो आप इस कॉलबैक के बाद हर धक्का मिल जाएगा

navigationController:didShowViewController:animated: 

तो आप कर सकते हैं जांचें कि क्या दिखाया गया दृश्य नियंत्रक आपकी रूचि रखता है, फिर अपना एस्टैटस सेट करें।

-1

मैं इस तरह अपने प्रश्न का समझते हैं:

B *b = [[B alloc] init]; 
b.status = @"loaded"; 
[self.navigationController pushViewController:b animated:Yes]; 

आप एक और साधन के लिए एक नियंत्रक से एक मूल्य के पास करना चाहते हैं, तो आप pushViewController विधि का उपयोग करने से पहले एक मूल्य निर्दिष्ट किया है।

0

जहां

-(void)viewWillAppear:(BOOL)animated 
{ 

} 
+0

नोट, वह दृश्य विल्लएपियर को हर बार दृश्य कहा जाता है ..well - प्रकट होता है (कई बार हो सकता है) - और केवल एक बार दृश्य के रूप में देखने के लिए नहीं। – Lirik

+0

हां यह सही है कि आप एक वैश्विक चर बनाए रख सकते हैं जो विधि को कॉल करेगा लेकिन शर्त के कारण इसे निष्पादित नहीं किया जाएगा। क्या viewwillAppear आपके लिए सहायक है, यदि हां, तो मैं आपको कोड के लिए आगे मार्गदर्शन कर सकता हूं –

0

कोई प्रलेखन पता करने के लिए वास्तव में जब viewDidLoad ही कहा जाता है पर्याप्त जानकारी प्रदान करने वाले वस्तु बढ़ा रहे हैं के बजाय viewDidLoadviewWillAppear विधि में कोड अगली कक्षा में अर्थात लिखें।

UIViewController के प्रलेखन के तुरंत बाद ही दृश्य नियंत्रक स्मृति में उसके दृश्य पदानुक्रम के लोड होते ही इस

इस विधि कहा जाता है का कहना है

मेरा सुझाव है कि आप इस

की तरह एक कस्टम प्रारंभकर्ता बनाने
- (id)initWithStatus:(NSString *)status { 
} 

लेकिन, यदि आप इस चर का उपयोग करने के लिए यह देखने के लिए प्रयास कर रहे हैं कि दृश्य नियंत्रक का दृश्य 'लोड' है या नहीं , ऐसा करना संभव नहीं हो सकता है क्योंकि pushViewController या presentViewController विधियों को तुल्यकालिक होने की गारंटी नहीं है।

यहां तक ​​कि आईओएस 6 में भी, कोई स्पष्ट गारंटी नहीं थी कि जैसे ही विधि वापस आती है, दृश्य लोड हो जाएगा।

0

मैं सुझाव दूंगा कि दृश्य लोड होने के बाद आप एक प्रतिनिधि विधि को कॉल करें। नियंत्रक बी होने के लिए प्रतिनिधि सेट करें और देखने के बाद डिडलोड समाप्त होता है (नियंत्रक ए में) प्रतिनिधि विधि को कॉल करें। आप प्रतिनिधि के रूप में पैरामीटर भी पास कर सकते हैं।

नियंत्रक बी::

- (void)controllerIsLoaded:(ControllerA *)controllerA status:(NSString *)status 
{ 
    a.status = status; 
} 

नियंत्रक एक ज फ़ाइल:

@class ControllerA; 

@protocol ControllerADelegate <NSObject> 
- (void)controllerIsLoaded:(ControllerA *)controllerA status:(NSString *)status; 
@end 

@interface ControllerA : UIViewController 

@property (nonatomic, weak) id <ControllerADelegate> delegate; 

नियंत्रक एक

a.delegate = self; 
[b.navigationController pushViewController:a animated:YES]; 

प्रतिनिधि विधि लागू

यहाँ कुछ उदाहरण कोड है एमएम फ़ाइल:

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

    /* your viewDidLoad code here... */ 

    if ([_delegate respondsToSelector:@selector(controllerIsLoaded:status)]) 
     [_delegate controllerIsLoaded:self status:@"Loaded"]; 
} 
1

मेरे अनुभव में, एक UIViewController दृश्य lazily भरी हुई है, कोई फर्क नहीं पड़ता जो iOS संस्करण आप पर काम कर रहे हैं। यदि आप व्यू लोड को ट्रिगर करना चाहते हैं, और इसलिए , तो UIViewController आवंटित होने के बाद आपको दृश्य को देखना चाहिए। उदाहरण के लिए:

UIViewController *aViewController = [[CustomViewController alloc] init]; 
[aViewController view]; 

सुनिश्चित करें कि आप के रूप में

aViewController.view 

यह कोड नहीं है के बाद से है कि एक संकलक चेतावनी उत्पन्न होगा बनाओ।

... 
CustomViewController *a = [[CustomViewController alloc] init]; 
[b.navController pushViewController:a animated:YES]; 
[a view]; 
a.status = @"loaded"; 

मुझे पता है अगर आप इसके साथ अन्य कोई समस्या आ करते हैं:

तो, आपके मामले में यह कुछ इस तरह होना चाहिए था।

0

बंद अपने काम मेरे मामले में iOS7 के लिए एनीमेशन करें,

[b.navController pushViewController:a animated:NO]; 
a.status = @"loaded"; 
संबंधित मुद्दे