Как лучше всего установить флажок UIButton?

Я пытаюсь сделать стандартный флажок для своего приложения для iPhone из UIButton с заголовком и изображением. Изображение кнопки меняется между «неотмеченным» и «отмеченным» изображением.

Сначала я попытался создать подкласс UIButton, но UIButton не имеет метода -init*** для использования в моем методе -init.

Как лучше всего это сделать?

Заранее спасибо.


person cduck    schedule 09.02.2010    source источник


Ответы (9)


Вам не нужно создавать подкласс класса UIButton. По дизайну Objective-C предпочитает композицию наследованию.

UIButton является подклассом UIControl, который имеет свойство selected. Вы можете использовать это свойство для включения/выключения флажка точно так же, как это делает UISwitch.

Вы можете прикрепить действие к внутреннему событию кнопки touched up и выполнить переключение там, примерно так:

// when you setup your button, set an image for the selected and normal states
[myCheckBoxButton setImage:checkedImage forState:UIControlStateSelected];
[myCheckBoxButton setImage:nonCheckedImage forState:UIControlStateNormal];

- (void)myCheckboxToggle:(id)sender
{
    myCheckboxButton.selected = !myCheckboxButton.selected; // toggle the selected property, just a simple BOOL
}
person Jasarien    schedule 09.02.2010
comment
Вы также можете сделать это довольно хакерски с помощью одной строки. myCheckboxButton.selected = !myCheckboxButton.selected - person Diziet; 01.11.2012
comment
вы можете избежать if-else, установив изображение для состояния кнопки UIControlStateSelected;) - person Climbatize; 22.05.2013
comment
@Diziet Вы можете стать еще более хакерским, используя XOR, например: myCheckboxButton.selected^=1; - person Albert Renshaw; 23.06.2018

Установите изображения в кнопку:

[button setImage:uncheckedImage forState:UIControlStateNormal]
[button setImage:checkedImage forState:UIControlStateSelected]

Теперь все, что вам нужно сделать, это:

button.selected = state

и правильные изображения будут отображаться.

person emp    schedule 21.10.2011

Все, что вам нужно сделать, это установить 2 разных изображения для состояний UIControlStateNormal и UIControlStateSelected, затем в вашем селекторе изменить свойство selected кнопки.

Вот рабочий пример (замените имена изображений на свои):

- (void)loadView {
    // ...
    UIButton *chkBtn = [UIButton buttonWithType:UIButtonTypeCustom];
    [chkBtn setFrame:CGRectMake(0, 0, 300, 25)];

    [chkBtn setImage:[UIImage imageNamed:@"UNCHECKED.png"] 
            forState:UIControlStateNormal];
    [chkBtn setImage:[UIImage imageNamed:@"CHECKED.png"]
            forState:UIControlStateSelected];

    [chkBtn addTarget:self 
               action:@selector(chkBtnHandler:) 
     forControlEvents:UIControlEventTouchUpInside];

    // Optional title change for checked/unchecked
    [chkBtn setTitle:@"I am NOT checked!"
            forState:UIControlStateNormal];
    [chkBtn setTitle:@"I am checked!"
            forState:UIControlStateSelected];

    [self.view addSubview:chkBtn];
    [chkBtn release], chkBtn = nil;
    // ...
}

- (void)chkBtnHandler:(UIButton *)sender {
    // If checked, uncheck and visa versa
    [sender setSelected:!sender isSelected];
}
person chown    schedule 24.01.2012

Для тех, кто интересуется будущим - вместо того, чтобы делать это самостоятельно, просто скачайте ссылку ниже с GitHub, и она уже имеет подкласс из UIControl и отлично работает как флажок. Также включает пример проекта о том, как легко его использовать:

https://github.com/Brayden/UICheckbox

person Brayden    schedule 18.07.2012

Я использовал M13Checkbox в одном из своих проектов. Работает нормально.

https://github.com/Marxon13/M13Checkbox

person neoneye    schedule 02.08.2014

Вы пытались переопределить метод initWithCoder на случай, если он каким-то образом загружается из пера?

person willcodejavaforfood    schedule 09.02.2010
comment
Не ответ на самом деле. - person Johan Karlsson; 03.07.2014

    UIImage* nonCheckedImage=[UIImage imageNamed:@"ic_check_box_outline_blank_grey600_48dp.png"];//[UIImage init
    UIImage* CheckedImage=[UIImage imageNamed:@"ic_check_box_black_48dp.png"];//[UIImage init

    //ic_check_box_black_48dp.png
    [_checkBox setImage:CheckedImage forState:UIControlStateSelected];
    [_checkBox setImage:nonCheckedImage forState:UIControlStateNormal];
}

- (IBAction)checkBoxToggle:(id)sender {
    _checkBox.selected = !_checkBox.selected; // toggle the selected property, just a simple BOOL

}

изображение, которое вы можете использовать значок Google

person Gank    schedule 28.11.2014

Попробуй это:-

-(IBAction)clickCheckButton:(UIButton *)sender {

    if (sender.tag==0) {

    sender.tag = 1;

    [sender setImage:[UIImage imageNamed:@"check.png"] forState:UIControlStateNormal]; 

    }else

    {

    sender.tag = 0;

    [sender setImage:[UIImage imageNamed:@"uncheck.png"] forState:UIControlStateNormal]; } } sender.tag = 0;

    [sender setImage:[UIImage imageNamed:@"uncheck.png"] forState:UIControlStateNormal];

    } 
}
person King    schedule 18.12.2014
comment
что он не хочет попробовать? - person chouaib; 18.12.2014
comment
Я имею в виду, что не всегда хочется что-то пробовать без объяснений. - person chouaib; 18.12.2014

Почему бы не использовать переключатель - UISwitch? Это используется для отображения элемента, показывающего логическое состояние значения.

person Jeff R    schedule 24.11.2016