一直在寻找这个答案有一段时间没有运气。从Google到StackOverflow。到目前为止,我发现的唯一答案是告诉人们在视图中调用initWithFrame而不是仅调用init。我用initWithFrame代替了对UIViews中所有对init的调用,但是我没有任何运气。
我没有使用IB。
这是我的整个代码:
@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];
}
如您所见,我使用UnlockKeyboard继承了UIView。 UnlockKeyboard应该具有另一个子视图(keypadView),其中将包含所有UIButton。因此,所有keyboardView都是UnlockKeyboards的子视图,所有这些按钮都应位于keyboardView内。我可以很好地添加它们,但是当我尝试点击它们时,它们的控制状态不会改变。是的,就像您看到的一样,在创建UIViews时,我将所有对init的调用替换为initWithFrame。
任何帮助,将不胜感激。
最佳答案
您需要为按钮添加目标,以使它们知道按下按钮时要调用的方法。看起来像这样
[button addTarget:self action:@selector(method) forControlEvents:UIControlEventTouchUpInside];
其中self是包含方法的实例,而method是单击按钮时运行的方法。
希望这对你有用
干杯,
〜约翰