Скрытие или перемещение SegmentContoller - PullRequest
3 голосов
/ 01 февраля 2011

Здравствуйте. Я пытался решить эту проблему в течение 3 недель, и это ставит меня в тупик.То, что я пытаюсь сделать, это создать сегмент из 3 частей из массива, отобразить его в виде в определенной позиции, а затем удалить его из вида, когда установлен флаг «OFF».Все работает, кроме удаления сегмента.Он даже коммутирует с (pickOne) и отображает буквы сегмента в метке.То, что я не могу получить на работу, это либо из двух: setHidden: YES или removeAllSegments.Любая помощь будет оценена.Вот мой код.

- (void) showSegment {

    int x = 192; 
    int y = 212;

    int w = 125;
    int h = 25;

    SegUnit1 = @"A";
    SegUnit2 = @"B";
    SegUnit3 = @"C";

    threeSegs = [NSArray arrayWithObjects: SegUnit1, SegUnit2, SegUnit3, nil];  
    segSize = [NSArray arrayWithArray:threeSegs];

    UISegmentedControl *heightSC = [[UISegmentedControl alloc] initWithItems:segSize];  

    if ([segmentState_height isEqualToString:@"ON"]) {

        NSLog(@"segmentState_height = %@",segmentState_height); 
        heightSC.frame = CGRectMake(x, y, w, h);    
        heightSC.segmentedControlStyle = UISegmentedControlStyleBar;
        heightSC.selectedSegmentIndex = -1;
        [heightSC addTarget:self
                     action:@selector(pickOne:)
           forControlEvents:UIControlEventValueChanged];
        [self.view addSubview:heightSC];
        [heightSC release]; 
    }   else if ([segmentState_height isEqualToString:@"OFF"]) {

        NSLog(@"segmentState_height = %@",segmentState_height);
        [heightSC setHidden:YES]; // NSLog showing "OFF" but segment will not hide. 
        [heightSC removeAllSegments]; // NSLog showing "OFF" and segment is suppose to dismantle and does not.

    }
}

Теперь я знаю, что мне нужно «не» создавать и удалять в одной и той же функции, и мне дали совет по исправлению этого, но я не знаю, как использоватьtip.

вот что было предложено.

Ваш метод немного запутан, поскольку вы пытаетесь одновременно создавать и скрывать.Таким образом, вы можете рассмотреть возможность его разделения на отдельные методы.

В общем случае это будет выглядеть следующим образом:

Код:

if ([self theControlProperty] == nil)
{
    UISeg... *theControl = [[UISeg alloc] ....];

    [self setTheControlProperty:theControl];

    ...

}

if (shouldHideTheControl)
{
    [[self theControlProperty] setHidden:YES];
}

Буду признателен за любую помощь

Ответы [ 4 ]

2 голосов
/ 01 февраля 2011

Проблема в том, что вы создаете новый экземпляр UISegmentedControl каждый раз, когда вызывается этот метод. В первый раз вы создаете экземпляр и добавляете его в качестве подпредставления к своему представлению. Это, видимо, работает нормально, как и должно. Затем метод возвращается, и у вас больше нет простого способа сослаться на тот экземпляр, который вы создали. При повторном вводе -showSegment вы создаете другой экземпляр, а затем скрываете и / или уничтожаете его. Этот другой экземпляр никак не влияет на экземпляр, который вы дали представлению.

Что вам нужно сделать, это сделать heightSC переменной экземпляра. Добавьте его к объявлению интерфейса в заголовочном файле, затем инициализируйте его только один раз, а затем спрячьте или измените его при необходимости. Ключевым моментом является то, что вам нужно иметь ссылку на экземпляр UISegmentedControl, который рисуется на экране, ссылку, которая живет вне самого метода, который вы можете использовать второй, третий, четвертый и т. Д. При вызове этого метода .

0 голосов
/ 02 февраля 2011

Я попробовал это и получил результаты, которые искал. Спасибо Mythogen и BrianSlick. Мне просто нужно проверить и убедиться, что нет утечек. Теперь это будет задача.

Кто-нибудь знает, нужен ли мне второй [heightSC release];?

// .h

@ interface ------ {
UISegmentedControl *segmentPicked;
}

|

@property (nonatomic, retain) UISegmentedControl *segmentPicked;

// .m

|

@synthesize segmentPicked;

|

if ([self segmentPicked] == nil) {

    UISegmentedControl *heightSC = [[UISegmentedControl alloc] initWithItems:segSize];  
    [self setSegmentPicked:heightSC];
    [heightSC release]; 
    heightSC.frame = CGRectMake(x, y, w, h);    
    heightSC.segmentedControlStyle = UISegmentedControlStyleBar;
    heightSC.selectedSegmentIndex = -1;
    [heightSC addTarget:self
    action:@selector(pickOne:)
    forControlEvents:UIControlEventValueChanged];
    [self.view addSubview:heightSC];
    [heightSC release];
}

if ([segmentState_height isEqualToString:@"OFF"])
{
    [[self segmentPicked] setHidden:YES];
} else {
    [[self segmentPicked] setHidden:NO];
}
0 голосов
/ 01 февраля 2011

Попробуйте использовать удаление сегментов в вашем методе выбора кнопки pickOne. Это выводит его за пределы метода showSegment и сопоставляет желаемое действие пользователя, чтобы внести изменения и убрать кнопки.

- (void) pickOne:(id)sender {

    UISegmentedControl* userChose = sender; 

    if( [userChose selectedSegmentIndex] == 0 ){

        your first button operation;
        [heightSC removeAllSegments];
    }

    if( [userChose selectedSegmentIndex] == 1 ){

        your second button operation;
        [heightSC removeAllSegments];

        }   
    if( [userChose selectedSegmentIndex] == 2 ){

        your third button operation;
        [heightSC removeAllSegments];

        }
     }
0 голосов
/ 01 февраля 2011
[yourSegment removeFromSuperview];

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...