简体   繁体   English

添加到视图的子视图的UIButton无法响应

[英]UIButton Added to a View's Subview Won't Respond

Been looking for this answer for a while with no luck. 一直在寻找这个答案有一段时间没有运气。 From Google to StackOverflow. 从Google到StackOverflow。 The only answers I have found so far tell people to call initWithFrame in a view instead of just init. 到目前为止,我发现的唯一答案是告诉人们在视图中调用initWithFrame而不是仅调用init。 I replaced all my calls to init in UIViews with initWithFrame but I'm not having any luck. 我用initWithFrame代替了对UIViews中所有对init的调用,但是我没有任何运气。

I'm not using IB. 我没有使用IB。

Here is my whole code for that: 这是我的整个代码:

@interface UnlockKeyboard : UIView
{
    NSArray *buttons;
    UITextField *passcodeFields;

    UIImage *buttonBackgroundImage;
    UIImage *buttonBackgroundHighlightedImage;
    UIImage *middleButtonBackgroundImage;
    UIImage *middleButtonBackgroundImageHighlighted;
    UIImage *screenBackgroundImage;
    UIImage *keypadViewBackgroundImage;

    UIView *infoView;
    UIView *keypadView;
}
@property(nonatomic, retain)UIImage *buttonBackgroundImage;
@property(nonatomic, retain)UIImage *buttonBackgroundHighlightedImage;
@property(nonatomic, retain)UIImage *screenBackgroundImage;
@property(nonatomic, retain)UIImage* keypadViewBackgroundImage;

@end

@implementation UnlockKeyboard
@synthesize buttonBackgroundImage = _buttonBackgroundImage;
@synthesize buttonBackgroundHighlightedImage = _buttonBackgroundHighlightedImage;
@synthesize screenBackgroundImage = _screenBackgroundImage;
@synthesize keypadViewBackgroundImage = _keypadViewBackgroundImage;
-(id)init
{
    if((self = [super initWithFrame:CGRectMake(0, 0, 320, 480)]))
    {
        _unlockKeyboardBundle = [NSBundle bundleForClass:[self class]];
        buttonBackgroundImage = [UIImage imageWithContentsOfFile:[_unlockKeyboardBundle pathForResource:@"button" ofType:@"png"]];
        middleButtonBackgroundImage = [UIImage imageWithContentsOfFile:[_unlockKeyboardBundle pathForResource:@"middleButton" ofType:@"png"]];
        buttonBackgroundHighlightedImage = [UIImage imageWithContentsOfFile:[_unlockKeyboardBundle pathForResource:@"pushedButton" ofType:@"png"]];
        middleButtonBackgroundImageHighlighted = [UIImage imageWithContentsOfFile:[_unlockKeyboardBundle pathForResource:@"pushedButtonMiddle" ofType:@"png"]];
        keypadView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 200)];
        NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

        NSMutableArray *tempButtons = [NSMutableArray array];
        //self.frame = CGRectMake(320, 480, 0, 0);
        self.backgroundColor = [UIColor lightGrayColor];
        self.opaque = YES;

        UIButton *button1 = [UIButton buttonWithType:UIButtonTypeCustom];
        [button1 setTitle:@"1" forState:UIControlStateNormal];
        button1.frame = CGRectMake(0, 261, 106, 50);

        UIButton *button4 = [UIButton buttonWithType:UIButtonTypeCustom];
        [button4 setTitle:@"4" forState:UIControlStateNormal];
        button4.frame = CGRectMake(0, 311, 106, 50);

        UIButton *button7 = [UIButton buttonWithType:UIButtonTypeCustom];
        [button7 setTitle:@"7" forState:UIControlStateNormal];
        button7.frame = CGRectMake(0, 361, 106, 50);

        UIButton *hint = [UIButton buttonWithType:UIButtonTypeCustom];
        [hint setTitle:NSLocalizedString(@"Hint", @"Hint string") forState:UIControlStateNormal];
        hint.frame = CGRectMake(0, 411, 106, 50);

        UIButton *button2 = [UIButton buttonWithType:UIButtonTypeCustom];
        [button2 setTitle:@"2" forState:UIControlStateNormal];
        button2.frame = CGRectMake(106, 261, 108, 50);

        UIButton *button5 = [UIButton buttonWithType:UIButtonTypeCustom];
        [button5 setTitle:@"5" forState:UIControlStateNormal];
        button5.frame = CGRectMake(106, 311, 108, 50);

        UIButton *button8 = [UIButton buttonWithType:UIButtonTypeCustom];
        [button8 setTitle:@"8" forState:UIControlStateNormal];
        button8.frame = CGRectMake(106, 361, 108, 50);

        UIButton *button0 = [UIButton buttonWithType:UIButtonTypeCustom];
        [button0 setTitle:@"0" forState:UIControlStateNormal];
        button0.frame = CGRectMake(106, 411, 108, 50);

        UIButton *button3 = [UIButton buttonWithType:UIButtonTypeCustom];
        [button3 setTitle:@"3" forState:UIControlStateNormal];
        button3.frame = CGRectMake(214, 261, 106, 50);

        UIButton *button6 = [UIButton buttonWithType:UIButtonTypeCustom];
        [button6 setTitle:@"6" forState:UIControlStateNormal];
        button6.frame = CGRectMake(214, 311, 106, 50);

        UIButton *button9 = [UIButton buttonWithType:UIButtonTypeCustom];
        [button9 setTitle:@"9" forState:UIControlStateNormal];
        button9.frame = CGRectMake(214, 361, 106, 50);

        UIButton *cancelOrDelete = [UIButton buttonWithType:UIButtonTypeCustom];
        [cancelOrDelete setTitle:@"<-" forState:UIControlStateNormal];
        cancelOrDelete.frame = CGRectMake(214, 411, 108, 50);

        [tempButtons addObject:button1];
        [tempButtons addObject:button2];
        [tempButtons addObject:button3];
        [tempButtons addObject:button4];
        [tempButtons addObject:button5];
        [tempButtons addObject:button6];
        [tempButtons addObject:button7];
        [tempButtons addObject:button8];
        [tempButtons addObject:button9];
        [tempButtons addObject:button0];
        [tempButtons addObject:hint];
        [tempButtons addObject:cancelOrDelete];

        for(UIButton *theButton in tempButtons)
        {
            if([theButton.currentTitle isEqualToString:@"2"] || [theButton.currentTitle isEqualToString:@"5"] || [theButton.currentTitle isEqualToString:@"8"] || [theButton.currentTitle isEqualToString:@"0"])
            {
                [theButton setBackgroundImage:middleButtonBackgroundImage forState:UIControlStateNormal];
                [theButton setBackgroundImage:middleButtonBackgroundImageHighlighted forState:UIControlStateHighlighted];
            }else
            {
                [theButton setBackgroundImage:buttonBackgroundImage forState:UIControlStateNormal];
                [theButton setBackgroundImage:middleButtonBackgroundImageHighlighted forState:UIControlStateHighlighted];
            }
            [keypadView addSubview:theButton];
        }
        [self addSubview:keypadView];

        [pool drain];
    }
    return self;
}
-(void)dealloc
{
    [buttons release];
    [passcodeFields release];
    [buttonBackgroundImage release];
    [buttonBackgroundHighlightedImage release];
    [screenBackgroundImage release];
    [infoView release];
    [keypadView release];
    [super dealloc];
}

Like you can see, I subclass UIView with UnlockKeyboard. 如您所见,我使用UnlockKeyboard继承了UIView。 UnlockKeyboard should have another subview (keypadView) that will contain all the UIButtons. UnlockKeyboard应该具有另一个子视图(keypadView),其中将包含所有UIButton。 So all in all keyboardView is a subview of UnlockKeyboards, and all these buttons should be inside keyboardView. 因此,所有keyboardView都是UnlockKeyboards的子视图,所有这些按钮都应位于keyboardView内。 I can add them just fine, but when I try to tap them, their control state doesn't change. 我可以很好地添加它们,但是当我尝试点击它们时,它们的控制状态不会改变。 And yes, like you have see, I replaced all calls to init with initWithFrame when creating UIViews. 是的,就像您看到的那样,在创建UIViews时,我将所有对init的调用替换为initWithFrame。

Any help with this will be really appreciated. 任何帮助,将不胜感激。

you need to add targets for the buttons so that they know what method to call when you push them. 您需要为按钮添加目标,以使它们知道按下按钮时要调用的方法。 It would look something like this 看起来像这样

[button addTarget:self action:@selector(method) forControlEvents:UIControlEventTouchUpInside];

where self is the instance that contains method, and method is the method that is run when the button is clicked. 其中self是包含method的实例,而method是单击按钮时运行的方法。

Hope this works for you 希望这对你有用

Cheers, 干杯,

~John 〜约翰

You need to set the image for control state, not the background image for control state: 您需要为控件状态设置图像,而不是控件状态的背景图像:

[btn setImage: [UIImage imageNamed: @"image.png"] forState: UIControlStateNormal];

So it would look like: 因此,它看起来像:

[theButton setImage:middleButtonBackgroundImage forState:UIControlStateNormal];
            [theButton setBackgroundImage:middleButtonBackgroundImageHighlighted forState:UIControlStateHighlighted];

Since there's no target or action defined for the buttons, the buttons don't know what you want to do. 由于没有为按钮定义目标或操作,因此按钮不知道您想做什么。 If you did have an action, you could use the action method to change the state of the sender (the sender being the button). 如果确实有操作,则可以使用action方法更改发送者的状态(发送者为按钮)。

Figured it out. 弄清楚了。 The way I was setting the button frames in regards to keypadView was complete messed up. 我设置有关keyboardView的按钮框架的方式完全搞砸了。 I had forgotten to do some frame changes to my buttons when I decided to add them to the superview, so the buttons displayed correctly, "but their coordinates were not right" in regards to their touch events. 当我决定将按钮添加到超级视图时,我忘记对按钮做一些框架更改,因此按钮可以正确显示,但就其触摸事件而言,“但坐标不正确”。 So the actual button was for example in (3,4), but it's touchpoint was in (10,20). 例如,实际按钮位于(3,4)中,但接触点位于(10,20)中。

Fixing the frames to play better with the superview fixed my issues 修复框架以使Superview更好地播放,从而解决了我的问题

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM