2012-04-10 77 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;