代表为零,使用故事板嵌入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 *)svc
或 right
在我的 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.lvc
在prepareForSegue: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的主要内容,如果未能解决你的问题,请参考以下文章