相关代码:
- (void) createButtons {
NSMutableArray *buttonTitleArray = [[NSMutableArray alloc] init];
[buttonTitleArray addObject:@"Website"];
[buttonTitleArray addObject:@"Blah"];
[buttonTitleArray addObject:@"Blah"];
int xPosition = 20;
for (int i = 0; i <= buttonTitleArray.count-1; i++) {
UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(xPosition, 25, 90, 40)];
button.userInteractionEnabled = TRUE;
[button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
[button setTitle:[buttonTitleArray objectAtIndex:i] forState:UIControlStateNormal];
button.backgroundColor = [UIColor colorWithRed:1 green:200.0/255.0 blue:0 alpha:1];
button.titleLabel.font = [UIFont systemFontOfSize:17];
[self.buttonArray addObject:button];
xPosition += 91;
}
for (UIButton *button in self.buttonArray) {
[button addTarget:self action:@selector(showWebsite:) forControlEvents:UIControlEventTouchDown];
[self.view addSubview:button];
}
}
- (void)showWebsite:(UIButton *)sender {
NSLog(@"Website");
}
在init中:
NSMutableArray *tempArray = [[NSMutableArray alloc] init];
self.buttonArray = tempArray;
出于测试目的,我使所有按钮具有相同的目标。
当我点击按钮时,我将无法识别的选择器发送到实例。
有什么想法吗?
答案 0 :(得分:1)
出于某种原因,您发布的代码中的self
被释放,并且指针位置被操作系统重新用作UIGestureDelayedTouch
。
在您想要使用showWebsite
功能之前,请确保操作系统不会释放您正在创建这些按钮的对象。
有时人们会使用以下代码:
-(void)function
{
UIViewController *controller = [[UIViewController alloc] init];
[someOtherView addSubview:controller.view];
}
在这种情况下,在函数结束时控制器被释放(因为没有对它的进一步引用),并且将来指向它的任何东西都将指向无效(解除分配且可能重用)对象
UIButton不保留设置为目标的对象,因此如果程序中的任何其他内容未保留对象,操作系统会认为这些对象对于发布是有效的。