2012-04-10 41 views
2

當執行模式的segue時,在執行segue之後,原始ViewController是否被丟棄?我將目標控制器的委託設置爲源ViewController,但是當目標ViewController.viewDidLoad,self.delegate爲零時...iOS Modal Segue丟棄源ViewController?

以下代碼將生成日誌消息「ListViewController.viewDidLoad:我的委託爲零:(」

[來源]的MapViewController:

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{ 
    if([segue.identifier isEqualToString:@"mapToList"]){ 
     NSLog(@"MapViewController.prepareForSegue: Segue mapToList being called, setting LisViewController's delegate to myself"); 
     [segue.destinationViewController setDelegate:self]; 
     if(!self){ 
      NSLog(@"MapViewController.prepareForSegue: I am nil."); 
     } else { 
      NSLog(@"MapViewController.prepareForSegue: I am NOT nil."); 
     } 
    } 
} 

[目的地] ListViewController:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    if(!self.delegate){ 
     NSLog(@"ListViewController.viewDidLoad: My delegate is nil :("); 
    } else { 
     NSLog(@"ListViewController.viewDidLoad: My delegate populated"); 
    } 
} 
+1

是否'MapViewController.prepareForSegue:Segue公司mapToList ...'顯示在控制檯? – Dion 2012-04-10 19:37:04

+0

是的,對不起,覺得那樣會很明顯。經過一些測試,特別是更改爲push segue,似乎原來的ViewController確實被解僱/清除...... – wuntee 2012-04-10 20:07:44

+1

我剛做了一個新的應用程序,它工作正常。 [在github上查看](https://github.com/mikezehrer/ModalDelegation)。 – 2012-04-10 20:54:04

回答

3

你的代碼似乎是正確的,我做的唯一不同的事情就是在骨架框架中測試這個,我有一個嵌套在navigationcontroller中的tableviewcontroller。我只是用下面的代碼測試,它爲我工作得很好:

RootViewController的.H:

@interface RootTableViewController : UITableViewController <newTest> 

準備Segue公司(在RootViewController的):

-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{ 

if ([segue.identifier isEqualToString:@"segueToModalView"]){ 
     [segue.destinationViewController setDelegate:self]; 
} 
} 

頂模態視圖控制器。 h:

@protocol newTest <NSObject> 
    -(void) hello; 
@end 

模態聲明屬性聲明:

@property (nonatomic, strong) id <newTest> delegate; 

viewDidLoad中在模式的看法:self.delegate的

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    NSLog(@"%@", self.delegate); 
} 

我的NSLog正確打印出來,我的代碼似乎或多或少和你的一樣。你的財產申報是否正確?

+1

所以,我認爲我的問題是,我的segue是一個NavigationView控制器,但與第二個NavigationViewController關聯的TableViewController沒有通過委託... – wuntee 2012-04-11 14:40:15

+0

檢查了這...這正是我的問題。當去secondView,並按下按鈕,它沒有一個委託集(我認爲由於沒有從NavigationController傳遞) - https://github.com/wuntee/SegueTest – wuntee 2012-04-11 15:08:00

+0

你是濫用你的git的模態意見項目。模態視圖被設計爲與顯示交互的視圖進行交互,然後退回到呈現視圖的視圖。它沒有理由導航到導航控制器(它不應該)。如果你想要這樣做,你不應該使用模態。 – 2012-04-11 15:19:51

1

如果賽格是NavigationController那麼destinationViewController會丟失委託。

我解決此問題得到了由具有模態SEGUE到destinationViewController,然後加入NavigationBarBar Buttons模擬導航控制器(我假設你在一個NavigationController包裹destinationViewController爲「完成」和「取消」按鈕) 。

坐落在rootViewController委託爲正常:

-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{ 

    if ([segue.identifier isEqualToString:@"segueToModalView"]){ 
    [segue.destinationViewController setDelegate:self]; 
    } 
} 

希望幫助

3

這是一個老問題,但運行到同一問題我自己,當我來到上面。事情夫婦在這裏:

  1. 爲了誰不明白爲什麼會有人想使用導航控制器採用模態顯示的傢伙 - 它讓導航欄的好處,而不必嵌入UINavigationBar的到您的自己的視圖控制器就像tw airball一樣。
  2. 爲了解決這個問題,不訴諸於什麼TW航空球確實記得在這種情況下,segue的目標視圖控制器是導航控制器...而不是嵌入在導航中的視圖控制器。

因此,解決方法是在你的prepareForSeque:

UINavigationController *navController = segue.destinationViewController; 
MyRealDestViewController *myRealDestViewController = (MyRealDestViewController)navController.topViewController; 
myRealDestViewController.delegate = self; 
相關問題