使用自定义 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 文件并查看包含所需功能的子类,就可以在这里做任何您想做的事情。
我用名为 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 文件并查看包含所需功能的子类,就可以在这里做任何您想做的事情。