使用自定义 ViewController 作为视图的顶部栏

Work with CustomViewController as top bar of views

我用名为 TopHeaderViewController 的 xib 文件创建了一个 class,现在我使用另一个 class 名为 iShared 的共享实例方法。 在 iShared 中,当我第一次在 iShared 上调用 sharedInstance 时,我现在有一个名为 topHeader 的 @属性: topHeader = [[TopHeaderViewController alloc]init];每次我浏览另一个 viewController 时,我都会将此视图放在视图控制器的顶部。 视图显示正确但按钮不触发事件。

viewController的代码:

- (void)viewDidLoad {
[super viewDidLoad];
ishared = [iShared sharedInstance];
// Do any additional setup after loading the view.
UIView *v = [ishared initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, headerView.frame.size.height)];

[headerView addSubview:v];

}

iShared 代码:

- (id)init
{
self = [super init];

topHeaderVC = [[TopHeaderViewController alloc]init];

}

TopHeaderViewController 代码:

- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
mainMenuController =[[UIStoryboard storyboardWithName:@"Main" bundle:nil] instantiateViewControllerWithIdentifier:@"mainMenuController"];
mainMenuController.superViewController = superViewController;
mainMenuController.view.frame = CGRectMake(0, self.view.frame.size.height, mainMenuController.view.frame.size.width, mainMenuController.view.frame.size.height);
[topView setBackgroundColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"sfondo_nero_sfumato"]]];
[topView setFrame:CGRectMake(topView.frame.origin.x , topView.frame.origin.y, superViewController.view.frame.size.width, topView.frame.size.height)];
ishared = [iShared sharedInstance];
[self aggiornaTicketNotificationValue_betCoupon:ishared.betCoupon];

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(receiveTestNotification:)
                                             name:NOTIFICATION_AGGIORNA_TOPHEADER_COUPON_LABEL
                                           object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(receiveTestNotification:)
                                             name:NOTIFICATION_AGGIORNA_TOPHEADER_ACCOUNT_DETAIL
                                           object:nil];
}
- (IBAction)mnClick:(id)sender {
iShared *ishared = [iShared sharedInstance];
if (![ishared menuAperto]){
    [UIView animateWithDuration:0.5
                          delay: 0
                        options:UIViewAnimationOptionCurveEaseIn
                     animations:^{
                         mainMenuController.view.alpha = 1.0;
                     }
                     completion:nil];
    [UIView commitAnimations];
    [superViewController.view addSubview:mainMenuController.view];
    ishared.menuAperto = true;
}else{
    [UIView animateWithDuration:0.5
                          delay: 0
                        options:UIViewAnimationOptionCurveEaseOut
                     animations:^{
                         mainMenuController.view.alpha = 0;
                     }
                     completion:nil];
    [UIView commitAnimations];
    [mainMenuController.view removeFromSuperview];

    ishared.menuAperto = false;
}

}

有人知道为什么我在让我的按钮工作时遇到这样的麻烦吗?

谢谢

问题是你所做的是完全非法和不连贯的。您不能只是将视图控制器的视图推送到您的界面中。视图控制器具有与其视图平行的结构层次结构,而您完全忽略了这一点。结果是您最终得到了没有视图控制器的视图。

那么你应该做什么?那么,我们可以从两个方向来看。一是您可能想知道如何将视图控制器的视图正确插入您的界面。答案是你必须让那个视图控制器成为你当前视图控制器的 child,然后小心翼翼地 "custom container controller" 跳舞,as I describe here.

但是,我建议您不是您想在这里做的。事实上,在我看来,您的情况只是对视图控制器的不当使用。你根本不需要视图控制器。您实际上只是在使用视图控制器去 "dumpster diving" 检索设计 xib 文件的视图。但是你不需要视图控制器来做到这一点!您只需使用 xib 文件并查看包含所需功能的子类,就可以在这里做任何您想做的事情。