#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(), тщательно размещенные в вашем коде, чтобы определить, является ли этот массив когда-либо непустым, и если это так, вы можете продолжать использовать эти вызовы, чтобы выяснить, где именно массив становится пустым.
Очевидно, что если массив пуст, то переключатель настроен иначе, чем вы ожидаете.