【发布时间】:2010-10-20 14:14:00
【问题描述】:
我有一个自定义 UIButton 作为子视图添加到 UIView 子类。在我的 viewController 中,我将自定义 uiview 作为子视图添加到控制器的视图中。然后我尝试将目标添加到 uibutton(在 viewWillLoad 内),但从未调用过选择器。
【问题讨论】:
标签: uiview uiviewcontroller uibutton
我有一个自定义 UIButton 作为子视图添加到 UIView 子类。在我的 viewController 中,我将自定义 uiview 作为子视图添加到控制器的视图中。然后我尝试将目标添加到 uibutton(在 viewWillLoad 内),但从未调用过选择器。
【问题讨论】:
标签: uiview uiviewcontroller uibutton
我只需要将 layoutSubviews 中的所有逻辑移动到构造函数中。
【讨论】:
确保你正在做这样的事情:
UIButton *btn = [UIButton buttonWithType: UIButtonTypeCustom];
btn.frame = CGRectMake(0, 0, 100, 40);
[btn setTitle:@"Click Me" forState: UIControlStateNormal];
[btn setBackgroundColor: [UIColor blackColor]];
[btn setTitleColor: [UIColor whiteColor] forState: UIControlStateNormal];
[btn addTarget:self action:@selector(buttonTap:) forControlEvents: UIControlEventTouchUpInside];
[self.view addSubview:btn];
这将创建一个按钮,当它被点击时调用 buttonTap 方法。
【讨论】:
这是自定义视图和视图控制器逻辑
//自定义视图
@implementation CustomUIASView
@synthesize firstButton;
@synthesize secondButton;
@synthesize thirdButton;
- (id)initWithFrame:(CGRect)frame {
if ((self = [super initWithFrame:frame])) {
self.alpha = .85;
self.backgroundColor = [UIColor blackColor];
}
return self;
}
- (void)layoutSubviews {
UIImage *buttonImageNormal;
UIImage *stretchableButtonImageNormal;
//
buttonImageNormal = [UIImage imageNamed:@"as-bg.png"];
stretchableButtonImageNormal = [buttonImageNormal stretchableImageWithLeftCapWidth:12 topCapHeight:0];
self.firstButton = [UIButton buttonWithType:UIButtonTypeCustom];
self.firstButton.frame = CGRectMake(10, 10, 300, 50);
self.firstButton.backgroundColor = [UIColor clearColor];
[self.firstButton setTitleColor:RGB(16,62,30) forState:UIControlStateNormal];
[self.firstButton setTitle:@"Watch Video" forState:UIControlStateNormal];
[self.firstButton setBackgroundImage:stretchableButtonImageNormal forState:UIControlStateNormal];
self.firstButton.titleLabel.font = [UIFont boldSystemFontOfSize:16.0f];
[self addSubview:self.firstButton];
self.secondButton = [UIButton buttonWithType:UIButtonTypeCustom];
self.secondButton.frame = CGRectMake(10, (10 + 50 + 5), 300, 50);
self.secondButton.backgroundColor = [UIColor clearColor];
[self.secondButton setTitleColor:RGB(16,62,30) forState:UIControlStateNormal];
[self.secondButton setTitle:@"Save to My Favorites" forState:UIControlStateNormal];
[self.secondButton setBackgroundImage:stretchableButtonImageNormal forState:UIControlStateNormal];
self.secondButton.titleLabel.font = [UIFont boldSystemFontOfSize:16.0f];
[self addSubview:self.secondButton];
self.thirdButton = [UIButton buttonWithType:UIButtonTypeCustom];
buttonImageNormal = [UIImage imageNamed:@"social-button-bg.png"];
stretchableButtonImageNormal = [buttonImageNormal stretchableImageWithLeftCapWidth:12 topCapHeight:0];
self.thirdButton.frame = CGRectMake(10, (secondButton.frame.origin.y + secondButton.frame.size.height + 5), 300, 50);
self.thirdButton.backgroundColor = [UIColor clearColor];
[self.thirdButton setTitleColor:RGB(16,62,30) forState:UIControlStateNormal];
[self.thirdButton setTitle:@"Share with Friends on" forState:UIControlStateNormal];
[self.thirdButton setBackgroundImage:stretchableButtonImageNormal forState:UIControlStateNormal];
[self.thirdButton setContentHorizontalAlignment:UIControlContentHorizontalAlignmentLeft];
CGRect thirdButtonFrame = thirdButton.titleLabel.frame;
self.thirdButton.titleLabel.font = [UIFont boldSystemFontOfSize:16.0f];
self.thirdButton.titleEdgeInsets = UIEdgeInsetsMake(thirdButtonFrame.origin.x, thirdButtonFrame.origin.y + 20, 0, 0);
[self addSubview:self.thirdButton];
[super layoutSubviews];
}
- (void)dealloc {
[firstButton release];
[secondButton release];
[thirdButton release];
[super dealloc];
}
@end
//视图控制器sn-p
self.uiasView = [[CustomUIASView alloc] initWithFrame:CGRectMake(0, (self.view.frame.size.height + 270), kDefaultFrameWidth, 300)];
[self.uiasView.firstButton addTarget:self action:@selector(pushToRunwayViewController:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:self.uiasView];
“pushToRunwayViewController”永远不会被调用
【讨论】:
不确定您是否自己想通了,但是当您将Target:self 添加到您的firstButton 时,self 是您实际的自定义视图,而不是视图控制器。
因此,如果您将 (pushToRunwayViewController) 方法移至 CustomAISView,一切都应该按预期工作。
我希望这会有所帮助。 罗格
【讨论】:
首先,UIView 与 UIControl 不同。 UIView 不知道具体如何处理不同的用户交互,也没有实现大部分的事件处理方法。
UIControl 会为您做到这一点。它值得注意的子类是 UIButton。尝试从 UIControl 子类化以获取事件处理的所有方法。对于更复杂的方式,在 UIView 的子类中,另一个 UIControl 子类,但我认为这不是一个好主意。
更多高级事件处理和消息传递看这个:
How to add UIViewController as target of UIButton action created in programmatically created UIView?
【讨论】: