iOS Modal Segue 会丢弃源 ViewController



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

以下代码将生成日志消息"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.");
        }
    }
}

[目标] 列表视图控制器:

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

您的代码似乎是正确的,我唯一不同的事情是在我拥有的框架中对此进行测试,该框架是嵌套在导航控制器中的表视图控制器。我刚刚使用以下代码进行了测试,它对我来说工作正常:

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;

模态视图中的视图确实加载:

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

self.delegate 的 NSLog 正确打印出来,我的代码看起来或多或少与您的代码相同。您的财产申报是否正确?

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

  1. 对于那些不明白为什么有人想要使用带有模态显示器的导航控制器的人 - 它可以获得导航栏的好处,而不必像 tw airball 那样将 UINavigationBar 嵌入到您自己的视图控制器中。
  2. 为了在不诉诸 tw airball 的情况下解决问题,请记住,在这种情况下,segue 的目标视图控制器是导航控制器......不是嵌入在导航中的视图控制器。

因此,修复程序在您的准备中:

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

如果 segue 是针对NavigationControllerdestinationViewController将失去委托。

我通过将模态 segue 放入destinationViewController中来解决这个问题,然后添加NavigationBarBar Buttons来模拟导航控制器(我假设您将destinationViewController包装在"完成"和"取消"按钮的NavigationController中)。

rootViewController中将委托设置为正常:

-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
   if ([segue.identifier isEqualToString:@"segueToModalView"]){
     [segue.destinationViewController setDelegate:self];  
   }
}

希望有帮助

最新更新