Проблема с UICustomSwitch,

#ios4

#ios4

Вопрос:

Я использую UICustomSwitch для своего приложения. Когда я пытаюсь его создать, я получаю исключение типа,

Завершение работы приложения из-за неперехваченного исключения ‘NSRangeException’, причина: ‘* -[NSArray objectAtIndex:]: индекс 2 выходит за пределы пустого массива’

Мой код выглядит следующим образом,

UICustomSwitch.h

  #import <Foundation/Foundation.h>


 @interface UICustomSwitch : UISwitch 
{
}
-(void)setLeftLabelText:(NSString *)labelText;
-(void)setRightLabelText:(NSString *)labelText;
@end
  

UICustomSwich.m

  #import "UICustomSwitch.h"


 @implementation UICustomSwitch
 -(UIView *)slider
 {
  return [[self subviews ] lastObject];
 }
-(UIView *)textHolder
{
  return [[[self slider] subviews]objectAtIndex:2];
 }
-(UILabel *)leftLabel
 {
   return [[[self textHolder] subviews]objectAtIndex:0];

  }
-(UILabel *)rightLabel
{
  return [[[self textHolder] subviews]objectAtIndex:1];

}
-(void)setLeftLabelText:(NSString *)labelText;
{
   [[self leftLabel] setText:labelText];
 }
-(void)setRightLabelText:(NSString *)labelText
{
   [[self rightLabel]setText:labelText];

}
@end
  

Просмотр контроллера:

      UICustomSwitch* switchView=[[[UICustomSwitch alloc]initWithFrame:CGRectMake(200,5,90,30)]autorelease];
    [switchView setLeftLabelText:@"F"];
    [switchView setRightLabelText:@"M"];
    [switchView addTarget:self action:@selector(genderAction:) forControlEvents:UIControlEventValueChanged];
    [elementView addSubview:switchView];
  

Я получаю исключение при вызове «return [[[self slider] subviews]objectAtIndex: 2];». Я не знаю, что не так, не могли бы вы, ребята, пожалуйста, подсказать мне по этому поводу.

Заранее спасибо, Сехар.

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

1. вы разобрались с этим? У меня такая же проблема…

2. У меня тоже такая же проблема!! Кто-нибудь, помогите! не будь бесполезным незнакомцем 🙂

Ответ №1:

Я столкнулся с этой проблемой и нашел ответ здесь:Пользовательский текст пользовательского интерфейса

В принципе, в iOS 4 в подвидах пользовательского интерфейса были UILabel, которые представляли метки «Включено / выключено». В iOS 5 в массиве subviews отсутствуют UILabels (отсюда и ошибка массива, которую вы получаете). Приведенная выше ссылка предлагает внешний класс, который вы можете загрузить и настроить. На мой взгляд, похоже, что Apple не поощряет настройку UISwitch. Требуемая функциональность может быть реализована другим способом (сегментированный элемент управления, имитированный флажок и т.д.).

Кроме того, в приведенной выше ссылке автор предполагает, что проблема может быть в том, что не включен armv6. Я пробовал это, и это не устраняет проблему.

Ответ №2:

Исключение указывает на то, что вы пытаетесь получить доступ к элементу массива, который находится за пределами (в месте, которое больше фактического размера массива).

Вы можете использовать точки останова и / или вызовы NSLog(), тщательно размещенные в вашем коде, чтобы определить, является ли этот массив когда-либо непустым, и если это так, вы можете продолжать использовать эти вызовы, чтобы выяснить, где именно массив становится пустым.

Очевидно, что если массив пуст, то переключатель настроен иначе, чем вы ожидаете.