Как создать пользовательскую UIButton внутри UIAlertView

#iphone #objective-c #cocoa-touch #uibutton #uialertview

#iPhone #objective-c #cocoa-touch #uibutton #uialertview

Вопрос:

Итак, я пытаюсь встроить переключаемый (это такое слово?) Кнопка «Не показывать это снова» внутри UIAlertView, но я столкнулся с некоторыми проблемами, которые, похоже, я не могу обойти.

Вот мой нерабочий код на данный момент…

ОТРЕДАКТИРОВАНО: я добавил метод кнопки и внес некоторые изменения в исходный код. Теперь я получаю кнопку, реагирующую на нажатие, но результатом является сбой. Любая помощь?

 if (![[NSUserDefaults standardUserDefaults] objectForKey:@"disclaimer"]){


UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"DISCLAIMER" 
                                                message:@"This program is a blah blah"
                                               delegate:self 
                                      cancelButtonTitle:nil
                                      otherButtonTitles:@"I Agree", nil];

UILabel *alertLabel = [[UILabel alloc] initWithFrame:CGRectMake(30, 230, 260, 50)];
alertLabel.backgroundColor = [UIColor clearColor];
alertLabel.textColor = [UIColor whiteColor];
alertLabel.text = @"Do not show again";
[alert addSubview:alertLabel];
[alertLabel release];

//declared alertCheckboxButton in the header due to errors I was getting when referring to the button in the button's method below
alertCheckboxButton = [UIButton buttonWithType:UIButtonTypeCustom];
alertCheckboxButton.frame = CGRectMake(200, 247, 16, 16);
alertCheckboxButton.backgroundColor = [UIColor clearColor];
UIImage *alertButtonImageNormal = [UIImage imageNamed:@"checkbox.png"];
UIImage *alertButtonImagePressed = [UIImage imageNamed:@"checkbox-pressed.png"];
UIImage *alertButtonImageChecked = [UIImage imageNamed:@"checkbox-checked.png"];
[alertCheckboxButton setImage:alertButtonImageNormal forState:UIControlStateNormal];
[alertCheckboxButton setImage:alertButtonImagePressed forState:UIControlStateHighlighted];
[alertCheckboxButton setImage:alertButtonImageChecked forState:UIControlStateSelected];
[alertCheckboxButton addTarget:self action:@selector(alertCheckboxButtonClicked:) forControlEvents:UIControlEventTouchUpInside];

//made the button a subview of alert rather than alertLabel
[alert addSubview:alertCheckboxButton];  
[alert show];

//moved alertCheckboxButton release to (void)dealloc
[alert release];    

}


-(void)alertCheckboxButtonClicked{

if (![[NSUserDefaults standardUserDefaults] objectForKey:@"disclaimer"]){

    [[NSUserDefaults standardUserDefaults] setBool:TRUE forKey:@"disclaimer"];
    alertCheckboxButton.selected = YES;
}else {

    [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"disclaimer"];
    alertCheckboxButton.selected = NO;
    }

}
  

Ответ №1:

Если вы хотите сделать эту кнопку переключателем, то назначьте этой кнопке тег, затем в ее функции события проверьте наличие тега, если он равен 0, затем установите его равным 1, а также установите там BOOL. Когда вы добавляете его в alert, проверьте значение BOOL, если это верно, измените изображение кнопки и тег также.

Комментарии:

1. Как мне изменить состояние кнопки? В моем коде ничего не происходит, если я нажимаю на него, т. Е. я не вижу разные png, я просто вижу одно и то же изображение controlstatenormal. Я знаю, как это сделать с помощью IB, но я не знаю, как программно изменить состояние кнопки.

Ответ №2:

ДУХ! Мой код работает. Просто пришлось удалить: в @selector(alertCheckboxButtonClicked 🙂

Разве это не всегда что-то простое?

Ответ №3:

Я думаю, вы просто хотите переключить свойство «selected» в UIControl. Если «выбрано» равно «ДА», то будет использоваться изображение для UIControlStateSelected…

Типичным эквивалентом флажка для iOS является UISwitch со свойством «включено».

Комментарии:

1. Позвольте мне спросить, есть ли лучший способ отобразить отказ от ответственности при запуске, который в идеале не отображался бы снова? (я предполагаю, что до обновления или переустановки или чего-то еще подобного это приведет к удалению пользовательских ошибок) Является ли actionsheet или какая-либо другая функция более приемлемым способом сделать это? Я трачу много времени, пытаясь разобраться с этой кнопкой, только для того, чтобы в итоге получилось что-то, что выглядит придурковато, и все мои пользователи говорят «Ida просто сделала это таким образом …»?