简体   繁体   English

委托为零,使用情节提要嵌入segue

[英]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 *)svcright

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中的某个地方存在问题

app structure 应用程式结构

故事板

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.lvcprepareForSegue: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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM