UISegmentControl не обновляет UILabel, подключенный к UIPickerView

Я новичок в Xcode и столкнулся с проблемой при создании своего приложения. Мое приложение состоит из UILabel, UIPickerView и UISegmentControl. Я хотел, чтобы мое приложение отображало другое значение в UILabel каждый раз, когда пользователь меняет выбранную строку в UIPickerView. Сначала у меня был только один набор значений для отображения в UILabel, но со временем я добавил второй набор. Я добавил UISegmentControl, чтобы пользователь мог переключаться между этими двумя наборами. Вот пример моих "условий if"

- (void)pickerView: (UIPickerView *)thePickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {

if (row == 0 && segmentController.selectedSegmentIndex == 0) {


    pickLabel.text=@"100 PPM";
}

else if (row == 0 && segmentController.selectedSegmentIndex == 1) {


    pickLabel.text=@"110 PPM";
}

else if (row == 1 && segmentController.selectedSegmentIndex == 0) {


    pickLabel.text=@"95 PPM";
}

else if (row == 1 && segmentController.selectedSegmentIndex == 1) {


    pickLabel.text=@"105 PPM";
}

Проблема в том, что значение в UILabel изменяется только при изменении выбранной строки в UIPickerView, а не при изменении элемента управления сегментом. Например, когда я меняю индекс управления сегментом, UILabel не меняется, пока я не переключусь на другую строку в UIPicker. Я хочу сделать IBAction, который заставляет UILabel изменяться при изменении индекса управления сегментом. Затем я подключу свой IBAction к UISegmentControl с «измененным значением». Мне нужен код для ввода в IBAction. Пожалуйста помоги!


person Miha Kitak    schedule 20.06.2013    source источник


Ответы (2)


- (void)pickerView: (UIPickerView *)thePickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {

выполняться, когда вы меняете только значение средства выбора. При изменении сегмента вы должны вызвать метод и сделать то же самое здесь, в этом методе.

Попробуй это

объявить

NSInteger selectedRowInpicker;

и использовать

-(IBAction)valueChanged
{
    if (selectedRowInpicker == 0 && segmentController.selectedSegmentIndex == 0) {


        pickLabel.text=@"100 PPM";
    }

    else if (selectedRowInpicker == 0 && segmentController.selectedSegmentIndex == 1) {


        pickLabel.text=@"110 PPM";
    }

    else if (selectedRowInpicker == 1 && segmentController.selectedSegmentIndex == 0) {


        pickLabel.text=@"95 PPM";
    }

    else if (selectedRowInpicker == 1 && segmentController.selectedSegmentIndex == 1) {


        pickLabel.text=@"105 PPM";
    }
}


- (void)pickerView: (UIPickerView *)thePickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
    selectedRowInpicker =row;
    [self valueChanged];
}

связать значениеChanged с действием сегмента "значение изменено"

person Lithu T.V    schedule 20.06.2013
comment
позаботьтесь о начальном условии в методе viewDidLoad или viewWillAppear - person Lithu T.V; 20.06.2013
comment
Спасибо. Это сработало для меня ... Приложение работает и все такое, но у меня возникает семантическая проблема. несовместимое преобразование целого числа в указатель, присвоенное «NSInteger *» (также известное как «int *») из «NSInteger» (также известное как «int»); взять адрес с & Я получаю это уведомление при каждом selectedRowInpicker = row; и строка выделена желтым цветом. - person Miha Kitak; 20.06.2013
comment
NSInteger не нужен *, обновил ответ, попробуйте использовать NSInteger selectedRowInpicker; - person Lithu T.V; 20.06.2013

вы также должны зарегистрировать событие для UISegmentedControl.

[segmentedControl addTarget:self action:@selector(valueChanged:) forControlEvents: UIControlEventValueChanged];

теперь создайте метод вроде:

-(void) valueChanged:(UISegmetedControl *)control
{
    [self modifyLabel];
}

- (void)pickerView: (UIPickerView *)thePickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
    [self modifyLabel];
}

-(void) modifyLabel
{
//Based on picker and segmented controller, update the label
}   
person Apurv    schedule 20.06.2013