[英]Delegate is nil, using storyboard embed segue
I'm creating app with side menu like facebook. 我正在使用侧面菜单(如Facebook)创建应用程序。 I have two containerView, which are connected with embed segue to their viewControllers.
我有两个containerView,它们通过嵌入segue连接到它们的viewControllers。
When i swipe in my sideVC i need to call method in my mainVC to hide side menu, i'm try to use delegate but it's nil :( 当我在sideVC中滑动时,我需要在mainVC中调用方法以隐藏侧面菜单,我尝试使用委托,但它为nil :(
Have my parent Class SlidingVC 有我的父母Class SlidingVC
SlidingVC.h SlidingVC.h
@class SlidingVC;
@protocol SlidingVCDelegate
-(void)slidingVCDidFinishLeft:(SlidingVC *)svc;
-(void)slidingVCDidFinishRight:(SlidingVC *)svc;
@end
@interface SlidingVC : UIViewController
@property(nonatomic, assign) id<SlidingVCDelegate> delegate;
@end
my left and right side controllers are his children 我的左右两侧控制器是他的孩子
@interface RightPanelSlidingVC : SlidingVC
------------------------------------------
@interface LeftPanelSlidingVC : SlidingVC
and i have my mainVC what contains my side menu and using SlidingVCDelegate 我有mainVC,其中包含我的侧边菜单并使用SlidingVCDelegate
@interface MainViewController : UIViewController <SlidingVCDelegate>
So i need to call in my mainVC method -(void)slidingVCDidFinishLeft:(SlidingVC *)svc
or right
所以我需要调用我的mainVC方法
-(void)slidingVCDidFinishLeft:(SlidingVC *)svc
或right
in my leftSideVC, when i make swipe i call: 在我的leftSideVC中,当我滑动时,我致电:
- (IBAction)swipeLeft:(UISwipeGestureRecognizer *)sender {
[self.delegate slidingVCDidFinishLeft:self];
NSLog(@"Swipe left");
}
in my mainVC 在我的mainVC中
@interface MainViewController ()
@property (strong, nonatomic) LeftPanelSlidingVC *lvc;
@property (strong, nonatomic) RightPanelSlidingVC *rvc;
@end
......
- (void)viewDidLoad
{
[super viewDidLoad];
self.lvc = [self.storyboard instantiateViewControllerWithIdentifier:@"Left VC"];
self.rvc = [self.storyboard instantiateViewControllerWithIdentifier:@"Right VC"];
}
-(void)slidingVCDidFinishLeft:(SlidingVC *)svc{
NSLog(@"Swipe left sucess!");
[self animateSlidingVC:svc reveal:NO];
[self shadowOpasity:0.0f from:2.0f to:0.0f inView:LeftContainer];
}
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if ([[segue identifier] isEqualToString:@"embedRightVC"]) {
self.rvc = (RightPanelSlidingVC *)segue.destinationViewController;
self.rvc.delegate = self;
}
if ([[segue identifier] isEqualToString:@"embedLeftVC"]) {
self.lvc = (LeftPanelSlidingVC *)segue.destinationViewController;
self.lvc.delegate = self;
}
}
but in mainVC my delegate is nil, i don't know why. 但是在mainVC中,我的代表为零,我不知道为什么。 As i think problem somewhere in embed segue
我认为嵌入segue中的某个地方存在问题
sorry for my English 对不起我的英语不好
for all I know, by default viewDidLoad
didn't automatically called in storyboard. 就我所知,默认情况下
viewDidLoad
不会在情节viewDidLoad
中自动调用。 You need to use awakeFromNib
rather than viewDidLoad
. 您需要使用
awakeFromNib
而不是viewDidLoad
。 that the reason why your self.lvc
is null in prepareForSegue:sender
. 那就是您的
self.lvc
在prepareForSegue:sender
为null的原因。
Change viewDidLoad
to awakeFromNib
: 将
viewDidLoad
更改为awakeFromNib
:
- (void)awakeFromNib
{
[super awakeFromNib];
self.lvc = [self.storyboard instantiateViewControllerWithIdentifier:@"Left VC"];
self.rvc = [self.storyboard instantiateViewControllerWithIdentifier:@"Right VC"];
}
Problem was in prepareForSegue
my panels were embeded in navController so i need to say that my navigationController is destinationController 问题是在
prepareForSegue
我的面板嵌入了navController中,所以我需要说我的navigationController是destinationController
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if ([[segue identifier] isEqualToString:@"embedRightVC"]) {
if ([segue.destinationViewController isKindOfClass:[UINavigationController class]]) {
UINavigationController* navController = segue.destinationViewController;
if ([navController.childViewControllers lastObject]) {
RightPanelSlidingVC *rightVC = navController.childViewControllers[0];
[self setRvc:rightVC];
[self.rvc setDelegate:self];
NSLog(@"Right Delegate");
}
}
}
if ([[segue identifier] isEqualToString:@"embedLeftVC"]) {
if ([segue.destinationViewController isKindOfClass:[UINavigationController class]]) {
UINavigationController* navController = segue.destinationViewController;
if ([navController.childViewControllers lastObject]) {
LeftPanelSlidingVC *leftVC = navController.childViewControllers[0];
[self setLvc:leftVC];
[self.lvc setDelegate:self];
NSLog(@"Left Delegate");
}
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.