在执行模态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");
}
}
答案 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)
这是一个古老的问题但我在遇到同样的问题时遇到了它。这里有几件事:
所以修复程序在你的prepareForSeque中:
UINavigationController *navController = segue.destinationViewController;
MyRealDestViewController *myRealDestViewController = (MyRealDestViewController)navController.topViewController;
myRealDestViewController.delegate = self;
答案 2 :(得分:1)
如果segue是NavigationController
,则destinationViewController
会失去代理人。
我解决了这个问题,方法是将模态转换为destinationViewController
,然后添加NavigationBar
和Bar Buttons
来模拟导航控制器(我假设你包裹了destinationViewController
在NavigationController
中为“完成”和“取消”按钮)。
在rootViewController
:
-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
if ([segue.identifier isEqualToString:@"segueToModalView"]){
[segue.destinationViewController setDelegate:self];
}
}
希望有所帮助