iOS Modal Segue会丢弃源ViewController吗?

时间:2012-04-10 19:34:42

标签: ios objective-c delegates segue viewcontroller

在执行模态segue时,执行segue后是否会丢弃原始ViewController?我将目标控制器的委托设置为源ViewController,但是当目标ViewController.viewDidLoad时,self.delegate是nil ...

以下代码将生成日志消息“ListViewController.viewDidLoad:我的委托是nil :(”

[来源] 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.");
        }
    }
}

[Destination] ListViewController:

- (void)viewDidLoad
{
    [super viewDidLoad];

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

3 个答案:

答案 0 :(得分: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:

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

我的self.delegate的NSLog正确打印出来,我的代码与您的代码大致相同。您的财产是否被正确宣布?

答案 1 :(得分:3)

这是一个古老的问题但我在遇到同样的问题时遇到了它。这里有几件事:

  1. 对于那些不明白为什么有人想要使用带有模态显示的导航控制器的人来说 - 它可以获得导航栏的好处而无需将UINavigationBar嵌入到您自己的视图控制器中,如tw airball那样。
  2. 为了解决这个问题而不诉诸于什么tw airball,我记得在这种情况下segue的目标视图控制器是导航控制器...而不是导航中嵌入的视图控制器。
  3. 所以修复程序在你的prepareForSeque中:

    UINavigationController *navController = segue.destinationViewController;
    MyRealDestViewController *myRealDestViewController = (MyRealDestViewController)navController.topViewController;
    myRealDestViewController.delegate = self;
    

答案 2 :(得分:1)

如果segue是NavigationController,则destinationViewController会失去代理人。

我解决了这个问题,方法是将模态转换为destinationViewController,然后添加NavigationBarBar Buttons来模拟导航控制器(我假设你包裹了destinationViewControllerNavigationController中为“完成”和“取消”按钮)。

rootViewController

中将代理设置为正常
-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{

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

希望有所帮助