代表为零,使用故事板嵌入segue

Posted

技术标签:

【中文标题】代表为零,使用故事板嵌入segue【英文标题】:Delegate is nil, using storyboard embed segue 【发布时间】:2014-02-16 22:34:49 【问题描述】:

我正在创建带有侧边菜单的应用程序,例如 facebook。 我有两个 containerView,它们通过 embed segue 连接到它们的 viewControllers。

当我在 sideVC 中滑动时,我需要调用 mainVC 中的方法来隐藏侧边菜单,我尝试使用委托,但它是 nil :(

让我的父类 SlidingVC

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

我的左右侧控制器是他的孩子

@interface RightPanelSlidingVC : SlidingVC
------------------------------------------
@interface LeftPanelSlidingVC : SlidingVC

我的 mainVC 包含我的侧边菜单并使用 SlidingVCDelegate

@interface MainViewController : UIViewController <SlidingVCDelegate>

所以我需要调用我的 mainVC 方法 -(void)slidingVCDidFinishLeft:(SlidingVC *)svcright

在我的 leftSideVC 中,当我滑动时我调用:

- (IBAction)swipeLeft:(UISwipeGestureRecognizer *)sender 
    [self.delegate slidingVCDidFinishLeft:self];
    NSLog(@"Swipe left");

在我的 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;
    

但在 mainVC 中,我的代表为零,我不知道为什么。 正如我认为嵌入 segue 某处的问题

app structure

对不起我的英语

【问题讨论】:

@rdelmar 很抱歉,但也许你能帮忙,我好吗? 【参考方案1】:

据我所知,默认情况下 viewDidLoad 不会在情节提要中自动调用。您需要使用awakeFromNib 而不是viewDidLoad。那就是你的self.lvcprepareForSegue:sender 中为空的原因。

viewDidLoad 更改为awakeFromNib

- (void)awakeFromNib

    [super awakeFromNib];

    self.lvc = [self.storyboard instantiateViewControllerWithIdentifier:@"Left VC"];
    self.rvc = [self.storyboard instantiateViewControllerWithIdentifier:@"Right VC"];

【讨论】:

之后我的 lvc 和 rvc 在我的 mainVC 中死了,我得到 [UINavigationController animationStarted]: unrecognized selector sent to instance 0x8168560【参考方案2】:

问题出在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");
            
        
    

【讨论】:

以上是关于代表为零,使用故事板嵌入segue的主要内容,如果未能解决你的问题,请参考以下文章

故事板 segue 调用顺序

使用自定义表格视图单元格中的故事板segue

没有故事板或 segue 的委托模式

带有程序故事板segue的NSInternalInconsistencyException

在多个故事板环境中展开 segue

故事板 segue 目的地不是预期类