UISegmentedControl не изменит значение

Я пытаюсь создать UISegmentedControl программно. у меня есть UIViewController в раскадровке, в которой ничего нет.

.h файл

UISegmentedControl *segmentedControl;
NSString *feedBackButtonTitle;
NSString *contactsButtonTitle;

а вот и объявления о недвижимости.

@property (nonatomic,retain) IBOutlet UISegmentedControl *segmentedControl;
-(void) segmentedControlIndexChanged;

В viewDidLoad: Я инициализировал и добавил UISegmentedControl,

   NSString *language = [[NSLocale preferredLanguages] objectAtIndex:0];
if ([language isEqualToString:@"en"]){
    contactsButtonTitle = [[[configFileDictionary objectForKey:@"Contacts"] objectForKey:@"Label"] objectForKey:@"en"];
    feedBackButtonTitle = [[[[[configFileDictionary objectForKey:@"Contacts"] objectForKey:@"Contact"]objectForKey:@"Feedback"]objectForKey:@"Label"]objectForKey:@"en"];
}
else if([language isEqualToString:@"fr"]){
    contactsButtonTitle = [[[configFileDictionary objectForKey:@"Contacts"] objectForKey:@"Label"] objectForKey:@"fr"];
    feedBackButtonTitle = [[[[[configFileDictionary objectForKey:@"Contacts"] objectForKey:@"Contact"]objectForKey:@"Feedback"]objectForKey:@"Label"]objectForKey:@"fr"];

}
NSArray *itemsArray = [[NSArray alloc] initWithObjects:contactsButtonTitle, feedBackButtonTitle, nil];
segmentedControl = [[UISegmentedControl alloc] initWithItems:itemsArray];
segmentedControl.segmentedControlStyle = UISegmentedControlStylePlain;
//segmentedControl.selectedSegmentIndex = 0;
segmentedControl.frame = CGRectMake(0.0f, 0.0f, 320.0f,40.0f);
[segmentedControl addTarget:self action:@selector(segmentedControlIndexChanged) forControlEvents:UIControlEventValueChanged];

 //  [self.view addSubview:segmentedControl];

// Create view for contact display.
[self createViews];

и это (void)segmentedControlIndexChanged

-(void)segmentedControlIndexChanged
{
    switch (self.segmentedControl.selectedSegmentIndex)
    {
        case 0:
            [self createViews];
            break;
        case 1:
            [self showFeedbackForm];
            break;
        default:
            break;
    }
}

Это хорошо показывает сегментированный элемент управления на экране, но когда я нажимаю на опции в сегментированном контроле, он всегда переходит в вариант варианта 0. Сегментированный элемент управления и открывается [self createViews];

На вставке точек останова на линии case 0Я заметил, что опция _selectedSegment в segmentedControl равна 1. Это не имеет никакого смысла.

2 ответа

Решение

Итак, я создал в моем UIViewController недвижимость segmentedControl а затем написал только этот код:

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSArray *itemsArray = [[NSArray alloc] initWithObjects:@"a", @"b", nil];

    self.segmentedControl = [[UISegmentedControl alloc] initWithItems:itemsArray];
    self.segmentedControl.segmentedControlStyle = UISegmentedControlStylePlain;
    self.segmentedControl.selectedSegmentIndex = 0;
    self.segmentedControl.frame = CGRectMake(0.0f, 0.0f, 320.0f,40.0f);
    [self.segmentedControl addTarget:self action:@selector(segmentedControlIndexChanged) forControlEvents:UIControlEventValueChanged];
    [self.view addSubview:self.segmentedControl];
}    

-(void)segmentedControlIndexChanged
{
    switch (self.segmentedControl.selectedSegmentIndex)
    {
        case 0:
            NSLog(@"createviews");
            break;
        case 1:
            NSLog(@"showfeedbackform");
            break;
        default:
            break;
    }
}

Это работает для меня отлично - регистрация правильного выбора.

Как вы говорите _segmentedControl все в порядке - обратите внимание, что я использую точечную нотацию, чтобы получить segmentedControl. Это может быть в том случае, если вы не используете точечную запись - вы не вызываете метод получения.

редактировать

Подводя итог - сегментированный контроль из вашего.h файла является излишним - это просто еще один UISegmentedControl, Ваша собственность может быть обозначена точечной нотацией - self.segmentedControl, Или по синтезированному имени (сделано по умолчанию) _segmentedControl,

Итак, вы делаете ссылку на этот объект.h при инициализации и добавлении UISegmentedController но когда segmentedControlIndexChanged называется - вы меняете его в своей собственности, которая даже не видна.

Хорошо, несколько вещей здесь:

  1. Поскольку у вас есть собственность, используйте self.segmentedControl вместо segmentedControl
  2. С простым изменением вашего селектора жизнь подписи становится проще:

[self.segmentedControl addTarget:self 
                          action:@selector(segmentedControlIndexChanged:)
                forControlEvents:UIControlEventValueChanged]; // Notice the colon

-(void)segmentedControlIndexChanged:(id)sender
{
    switch ([sender selectedSegmentIndex])
    {
        case 0:
            [self createViews];
            break;
        case 1:
            [self showFeedbackForm];
            break;
        default:
            break;
    }
}
Другие вопросы по тегам