以编程方式创建UIButtons - 将无法识别的选择器发送到实例

时间:2014-02-10 18:40:34

标签: ios objective-c uibutton

相关代码:

- (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;

出于测试目的,我使所有按钮具有相同的目标。

当我点击按钮时,我将无法识别的选择器发送到实例。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

出于某种原因,您发布的代码中的self被释放,并且指针位置被操作系统重新用作UIGestureDelayedTouch

在您想要使用showWebsite功能之前,请确保操作系统不会释放您正在创建这些按钮的对象。

有时人们会使用以下代码:

-(void)function
{
    UIViewController *controller = [[UIViewController alloc] init];

    [someOtherView addSubview:controller.view];
}

在这种情况下,在函数结束时控制器被释放(因为没有对它的进一步引用),并且将来指向它的任何东西都将指向无效(解除分配且可能重用)对象

UIButton不保留设置为目标的对象,因此如果程序中的任何其他内容未保留对象,操作系统会认为这些对象对于发布是有效的。