UISegmentedControl проблема написания текстовых меток - PullRequest
1 голос
/ 17 августа 2011

Добрый день,

У меня возникла следующая проблема с этим кодом:

-(void)textpopup:(UISegmentedControl *)sender {

    int nummer = sender.tag;

    if (sender.tag) {
       if(sender.selectedSegmentIndex == 0 || sender.selectedSegmentIndex == 1){
           beoordeling = [[UITextField alloc] init];
           beoordeling.frame = CGRectMake(50 , nummer * 117 + 275 , scrollView.frame.size.width - 100 , 35);
           beoordeling.autoresizingMask = (UIViewAutoresizingFlexibleWidth);
           beoordeling.borderStyle = UITextBorderStyleLine;
           beoordeling.tag = nummer;
           [scrollView addSubview:beoordeling];


       }
        if(sender.selectedSegmentIndex == 2 || sender.selectedSegmentIndex == 3){
            if (beoordeling.tag == sender.tag) {
                [beoordeling removeFromSuperview];
            }
        }

    }
}

Я объясню сценарий.Я получил некоторые динамические UISegmentedControls.На данный момент их 12.В первых двух выбранных сегментах текстовое поле должно появиться.Это идет хорошо.Но после выбора первых 2 сегментов на некоторое время, и когда я перехожу к сегментам 2 и 3, иногда текстовые поля не удаляются.

Я ожидал, что текстовые поля, которые пишутся, когда я нажимаю на сегменты 0 и 1,удаляется при нажатии на сегменты 2 и 3.

Я что-то упустил?

РЕДАКТИРОВАТЬ: Сначала я хочу сказать, что я никогда не знаю заранее, сколько UITextFieldsя получил.Когда сегменты 0 и 1 выбраны, UITextField должен появиться в соответствующем UISegmentedControl.И когда сегменты 2 и 3 выбраны, UITextField должен держаться подальше.Но теперь я исправил это следующим образом.

-(void)textpopup:(UISegmentedControl *)sender {

    int nummer = sender.tag;


       if(sender.selectedSegmentIndex == 0 || sender.selectedSegmentIndex == 1){

           // Before i add a new UITextField, the old one has to be removed.
           UITextField *text = (UITextField *)[beoordeling viewWithTag:sender.tag];
           [text removeFromSuperView];   

           beoordeling = [[UITextField alloc] init];
           beoordeling.frame = CGRectMake(50 , nummer * 117 + 275 , scrollView.frame.size.width - 100 , 35);
           beoordeling.autoresizingMask = (UIViewAutoresizingFlexibleWidth);
           beoordeling.borderStyle = UITextBorderStyleLine;
           beoordeling.tag = nummer;
           [scrollView addSubview:beoordeling];


       }
        else if(sender.selectedSegmentIndex == 2 || sender.selectedSegmentIndex == 3) {

            UITextField *tf = (UITextField *)[beoordeling viewWithTag:sender.tag];
            tf.text = nil;
            [tf removeFromSuperview];

        }


    }

Ответы [ 2 ]

0 голосов
/ 17 августа 2011

Второй if должен быть else if, потому что он должен выполняться, только если первый не выполняет (выбранный индекс не может быть и 0, и 2).

То, что вы пытаетесь сделать, зависит от того, как вы определили beoordeling.Я предлагаю иметь его в качестве переменной экземпляра, возможно, даже IBOutlet.Выпуск в вашем классе dealloc.Затем в первом предложении if напишите

if (!beoordeling) {
    beoordeling = [[UITextField alloc] init];
    // Other setup
}
[scrollView addSubview:beoordeling];

Я не совсем понимаю, почему вы проверяете тег, но для удаления во втором if просто вызовитеremoveFromSubview.

Все ли сегментированные элементы управления вызывают одинаковое поведение?Если у вас есть только один beorrdeling, для которого вы устанавливаете тег, вам не нужно беспокоиться о проверке тега.Просто добавьте / удалите его, используя removeFromSubview.Если у вас столько текстовых полей, сколько сегментированных элементов управления, возможно, KVC будет именно тем, что вам нужно.Если теги ваших сегментированных элементов управления идут от 0 до 11, у вас могут быть beoordeling0, beoordeling1, beoordeling2 и т. Д.Затем, чтобы получить тот, который вы хотите, используйте что-то вроде этого:

beoordeling = (UITextField *)[self valueForKey:[NSString stringWithFormat:@"beoordeling%d", sender.tag]];
0 голосов
/ 17 августа 2011

Не совсем уверен, чего вы здесь добиваетесь, но вам нужно выпустить ваш объект UITextField, иначе у вас будет утечка. AddSubview добавляет один к количеству сохраняемых данных, поэтому его можно сразу же разблокировать:

[scrollView addSubview:beoordeling];
[beoordeling release];
...