2013-10-02 30 views
6

我試圖從A中將視圖控制器B推入導航控制器,然後在A中分配B的一些屬性。
在這種情況下,完成屬性的賦值,然後viewcontroller A的viewDidLoad被執行。ViewDidLoad在推送視圖控制器時緩慢執行

在這裏,只應在A的viewDidLoad完成後才能在A中分配屬性。

例如,

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

在此,狀態被分配第一和然後A的viewDidLoad被執行。 這隻發生在iOS 7中,而在iOS6中它正常工作。

任何人都可以讓我知道問題在哪裏?

更新:對於我在iOS7的某些情況下,推視圖不起作用。我如何調試和修復它?

+0

你能否提供更多的代碼?可能有其他可能導致viewDidLoad執行的其他內容。 – Abhinit

回答

1

只需在alloc init之後訪問viewcontroller.view(在alloc之後立即設置任何東西)屬性;

哪個會loadview/viewdidload。
See Apple Documentation

0

可以知道,當一個視圖控制器已通過實現UINavigationControllerDelegate並設置自己作爲委託self.navigationController.delegate = self;壓入堆棧,然後你會得到這樣的回調後,每推

navigationController:didShowViewController:animated: 

這樣你就可以檢查顯示的viewController是否是你感興趣的viewController,然後設置你的a.status。

-1

我明白你的問題是這樣的:

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

如果你想從一個控制器值傳遞給另一種方式,你必須使用pushViewController方法之前,分配一個值。

0

你在哪裏推對象

-(void)viewWillAppear:(BOOL)animated 
{ 

} 
+0

請注意,每次查看..well - 出現(可能會發生多次)viewWillAppear被調用 - 而不只是一次viewDidLoad。 – Lirik

+0

是的,這是正確的,你可以維護一個全局變量,將調用該方法,但由於條件它不會被執行。 Viewwill對你有幫助,如果是的話,我可以引導你進一步的代碼 –

0

沒有文件提供足夠的信息,知道什麼時候viewDidLoad將被稱爲請寫在隔壁班,即在viewWillAppear方法的代碼,而不是viewDidLoad

UIViewController的文件只是說視圖控制器加載其視圖層次到內存中後,該

這種方法被稱爲

我建議你創建一個這樣

定製的初始化
- (id)initWithStatus:(NSString *)status { 
} 

但是,如果您試圖使用此變量來檢查viewController的視圖是否已「加載」 ,可能無法做到這一點,因爲pushViewController或presentViewController方法不保證是同步的。

即使在iOS 6中,也沒有明確的保證視圖會在該方法返回時立即加載。

0

我建議您在加載視圖後調用委託方法。 將委託設置爲控制器B. 和viewDidLoad完成後(在控制器A中)調用委託方法。您甚至可以根據需要將參數傳遞給委託人。

下面是一些示例代碼:

控制器B:

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

實現委託方法:

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

控制器A h文件:

@class ControllerA; 

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

@interface ControllerA : UIViewController 

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

控制器A .m文件:

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

    /* your viewDidLoad code here... */ 

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

根據我的經驗,一個UIViewController觀點是延遲加載的,無論哪個版本的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"; 
相關問題