2

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

以下代码将产生日志消息“ListViewController.viewDidLoad: My delegate is 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.");
        }
    }
}

[目的地] ListViewController:

- (void)viewDidLoad
{
    [super viewDidLoad];

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

3 回答 3

3

您的代码似乎是正确的,我唯一不同的是在我拥有的骨架框架中测试它,这是一个嵌套在导航控制器中的 tableviewcontroller。我刚刚使用以下代码进行了测试,它对我来说很好:

根视图控制器.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 正确打印出来,我的代码似乎与您的代码或多或少相同。您的财产申报正确吗?

于 2012-04-10T20:21:53.970 回答
3

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

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

所以修复在您的 prepareForSeque 中:

UINavigationController *navController = segue.destinationViewController;
MyRealDestViewController *myRealDestViewController = (MyRealDestViewController)navController.topViewController;
myRealDestViewController.delegate = self;
于 2014-07-18T15:14:07.827 回答
1

如果 segue 是对 aNavigationControllerdestinationViewController失去委托。

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

将委托设置为正常rootViewController

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

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

希望有帮助

于 2013-02-10T17:34:49.943 回答