1

我正在实现一个自定义 UIViewController 包含。

我还在层次结构中向子视图控制器的视图添加按钮。

问题是当按钮位于层次结构中的子视图控制器中时,按钮事件永远不会触发。它们仅在放置在根级别以下一级 - parentTopVc 时才有效。

架构是这样的:

根在:self.window.rootViewController = rootVc

等级制度:

0-----rootVc

1-----------parentTopVc <--- 按钮事件触发

2----------------------firstTopVc <--- 按钮事件不会触发

2---------------------secondTopVc <--- 按钮事件不会触发

AppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions (NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

UIViewController *rootVc;
UIViewController *parentTopVc;
UIViewController *firstTopVc;
UIViewController *secondTopVc;

rootVc = [UIViewController new];
self.window.rootViewController = rootVc;

parentTopVc = [UIViewController new];
[rootVc addChildViewController:parentTopVc]; 


[parentTopVc didMoveToParentViewController:rootVc];
//
parentTopVc.view.translatesAutoresizingMaskIntoConstraints = NO;
[rootVc.view addConstraint:
[NSLayoutConstraint
constraintWithItem:parentTopVc.view attribute:NSLayoutAttributeCenterX
relatedBy:0
toItem:rootVc.view attribute:NSLayoutAttributeCenterX
multiplier:1 constant:0]];

[rootVc.view  addConstraint:
[NSLayoutConstraint
constraintWithItem:parentTopVc.view attribute:NSLayoutAttributeTop
relatedBy:0
toItem:rootVc.view  attribute:NSLayoutAttributeTop
multiplier:1 constant:50]];

[rootVc.view  addConstraint:
[NSLayoutConstraint
constraintWithItem:parentTopVc.view attribute:NSLayoutAttributeLeft
relatedBy:0
toItem:rootVc.view  attribute:NSLayoutAttributeLeft
multiplier:1 constant:0]];
[rootVc.view  addConstraint:
[NSLayoutConstraint
constraintWithItem:parentTopVc.view attribute:NSLayoutAttributeRight
relatedBy:0
toItem:rootVc.view  attribute:NSLayoutAttributeRight
multiplier:1 constant:0]];

[parentTopVc.view addConstraint:
[NSLayoutConstraint
constraintWithItem:parentTopVc.view attribute:NSLayoutAttributeHeight
relatedBy:0
toItem:nil attribute:0
multiplier:1 constant:200]];

[rootVc.view addSubview: parentTopVc.view];
parentTopVc.view.backgroundColor = [UIColor clearColor];


firstTopVc = [UIViewController new];
secondTopVc = [UIViewController new];

[parentTopVc addChildViewController:childVc];
UIView* childVcInnerFrame = [[UIView alloc] initWithFrame:CGRectMake(xc,
                                                                   yc,
                                                                   wc,
                                                                   hc)]; //x, y, w, h
[childVc.view addSubview: childVcInnerFrame];



firstTopVc.view.translatesAutoresizingMaskIntoConstraints = NO;

[parentTopVc.view  addConstraint:
[NSLayoutConstraint
constraintWithItem:firstTopVc.view attribute:NSLayoutAttributeCenterX
relatedBy:0
toItem:parentTopVc.view  attribute:NSLayoutAttributeCenterX
multiplier:1 constant:0]];

[parentTopVc.view  addConstraint:
[NSLayoutConstraint
constraintWithItem:firstTopVc.view attribute:NSLayoutAttributeTop
relatedBy:0
toItem:parentTopVc.view  attribute:NSLayoutAttributeTop
multiplier:1 constant:0]];

// activate
[parentTopVc.view addSubview: firstTopVc.view];
[firstTopVc didMoveToParentViewController:parentTopVc];         


UIView *parentTopVcBtnViewsLevel1frame = [UIView new];

// add view to root
[parentTopVcInnerframeLevel1 addSubview: parentTopVcBtnViewsLevel1frame];

UIView *vtemp1;
vtemp1 = [UIView new];

[parentTopVcBtnViewsLevel1frame addSubview: vtemp1];

vtemp1.translatesAutoresizingMaskIntoConstraints = NO;

[parentTopVcBtnViewsLevel1frame addConstraint:
[NSLayoutConstraint
constraintWithItem:vtemp1 attribute:NSLayoutAttributeLeft
relatedBy:0
toItem:parentTopVcBtnViewsLevel1frame attribute:NSLayoutAttributeLeft
multiplier:1 constant:10]];

[parentTopVcBtnViewsLevel1frame addConstraint:
[NSLayoutConstraint
constraintWithItem:vtemp1 attribute:NSLayoutAttributeTop
relatedBy:0
toItem:parentTopVcBtnViewsLevel1frame attribute:NSLayoutAttributeTop
multiplier:1 constant:10]];

//v1: W
[vtemp1 addConstraint:
[NSLayoutConstraint
constraintWithItem:vtemp1 attribute:NSLayoutAttributeWidth
relatedBy:0
toItem:nil attribute:0
multiplier:1 constant:w]];

//v1: H
[vtemp1 addConstraint:
[NSLayoutConstraint
constraintWithItem:vtemp1 attribute:NSLayoutAttributeHeight
relatedBy:0
toItem:nil attribute:0
multiplier:1 constant:h]];

// button
btnInView = [UIButton buttonWithType:UIButtonTypeCustom]; //
[btnInView setBackgroundColor:[UIColor clearColor]];
btnInView.showsTouchWhenHighlighted=YES;

[btnInView setFrame: CGRectMake(0,0,w,h)]; // set up frame
[vtemp1 addSubview:btnInView]; // place button in view


[btnInView addTarget:self action:@selector(doShowNextTopVc:)
forControlEvents:UIControlEventTouchUpInside];

}

//
-(void) doShowNextTopVc:(UIButton *)paramSender{
NSLog(@"doShowNextTopVc: %@", @"START <==");
}

doShowNextTopVc 从不触发

4

1 回答 1

0

我有一种预感,您的触摸事件不会通过您的子根级别视图控制器,因为您没有在自定义容器中正确使用它们。您的 ViewController 指针也可能在didFinishLaunchingWithOptions:完成后未保留。如果不提供更多代码,就无法知道。

[编辑]我正在根据我通过评论找到的内容来澄清我的答案。

  1. 如果没有更多代码和对应用程序如何编写、编译和运行的更深入了解,我/我们无法帮助原始海报。下面的评论概述了一些已经提出的问题。
  2. 目前尚不清楚 AppDelegate 代码是如何生成的,因为原始发帖人提到他/她不能完整地发布它,并且它是自动生成的。
  3. 提供的代码中存在未提供指针声明的变量。它们是:childVCparentTopVCInnerframeLevel1btnInViewbtnInView完成后可能不会保留didFinishLaunchingWithOptions:,这可能是问题的一部分。
  4. 提供的源代码似乎不必要地调用didMoveToParentViewController:. 这里没有 UIViewController 子类,因此不需要调用它。尝试删除它。同样,尚不清楚 AppDelegate 代码是如何创建或编写的,或者原始发布者是否真的可以做到这一点。

最后 ....

如果您想要一个自定义视图控制器容器类,我会考虑阅读 Apple 的 View Controller Programming Guide:

http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/Introduction/Introduction.html#//apple_ref/doc/uid/TP40007457

我肯定会阅读左侧标题为“创建自定义容器视图控制器”的部分以及标题为“实现自定义容器视图控制器”的子部分

于 2013-03-28T23:01:37.833 回答