создать подclass uibutton

Я попытался подclassифицировать UIButton, чтобы включить индикатор активности, но когда я использую initWithFrame: (поскольку я подclassифицирую uibutton, я не использую buttonWithType :), кнопка не отображается. Также как бы я установил тип кнопки в этом случае ?:

мой controller просмотра:

ActivityIndicatorButton *button = [[ActivityIndicatorButton alloc] initWithFrame:CGRectMake(10, 10, 300, 44)]; [button addTarget:self action:@selector(buttonPressed) forControlEvents:UIControlEventTouchUpInside]; [button setTitle:@"Older Posts..." forState: UIControlStateNormal]; [cell addSubview:button]; [button release]; 

my activityindicatorbutton class:

 #import  @interface ActivityIndicatorButton : UIButton { UIActivityIndicatorView *_activityView; } -(void)startAnimating; -(void)stopAnimating; @end @implementation ActivityIndicatorButton - (id)initWithFrame:(CGRect)frame { if (self=[super initWithFrame:frame]) { _activityView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; _activityView.frame = CGRectOffset(_activityView.frame, 60.0f, 10.0f); [self addSubview: _activityView]; } return self; } -(void) dealloc{ [super dealloc]; [_activityView release]; _activityView = nil; } -(void)startAnimating { [_activityView startAnimating]; } -(void)stopAnimating { [_activityView stopAnimating]; } @end 

Вы действительно не хотите подclassа UIButton . Это кластер classов, поэтому отдельные экземпляры будут чем-то вроде UIRoundRectButton или другого частного classа Apple. Что вы пытаетесь сделать, это требует подclassа?

Благодарите композицию над наследованием.

Создайте UIView, который содержит компоненты, которые вам нужны, и добавьте их в свой вид.

Я столкнулся с подобной ситуацией и согласен с Джеффом, что вам действительно не нужно подclassы UIButton. Я решил это, подclassифицируя UIControl, а затем переопределяя layoutSubviews, чтобы выполнить всю конфигурацию просмотров, которые я хотел на своей «кнопке». Это гораздо более простая реализация, которая подclassифицирует UIButton, так как, похоже, скрытое mojo происходит под капотом. Моя реализация выглядела так:

 - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { self.opaque = YES; self.imageView = [[UIImageView alloc] initWithFrame:CGRectZero]; [self addSubview:self.imageView]; self.textLabel = [[UILabel alloc] initWithFrame:CGRectZero]; [self addSubview:self.textLabel]; } return self; } 

А layoutSubviews выглядел так:

 - (void)layoutSubviews { [super layoutSubviews]; // Get the size of the button CGRect bounds = self.bounds; // Configure the subviews of the "button" ... } 

Я создал собственный class, предпочитая композицию над наследованием, и он отлично работает. У моего пользовательского classа есть кнопка, и он знает, что это объект MCContact. Также он рисует правильную кнопку и автоматически вычисляет кадры с использованием объекта MCContact, который передается.

Пример файла заголовка:

 #import  @protocol MCContactViewDelegate; @interface MCContactView : UIView { } @property (nonatomic, strong) MCContact *mcContact; @property (nonatomic, weak) id  delegate; - (id)initWithContact:(MCContact*)mcContact delegate:(id )delegate; @end @protocol MCContactViewDelegate  - (void)contactViewButtonClicked:(MCContactView*)contactView; @end 

Файл реализации:

 #import "MCContactView.h" @interface MCContactView() { UIButton *_button; } @end @implementation MCContactView - (id)initWithContact:(MCContact*)mcContact delegate:(id )delegate { self = [super initWithFrame:CGRectZero]; if (self) { GetTheme(); _mcContact = mcContact; _delegate = delegate; _button = [UIButton buttonWithType:UIButtonTypeCustom]; UIImage *normalBackgroundImage = [[UIImage imageNamed:@"tokenNormal.png"] stretchableImageWithLeftCapWidth:12.5 topCapHeight:12.5]; [_button setBackgroundImage:normalBackgroundImage forState:UIControlStateNormal]; UIImage *highlightedBackgroundImage = [[UIImage imageNamed:@"tokenHighlighted.png"] stretchableImageWithLeftCapWidth:12.5 topCapHeight:12.5]; [_button setBackgroundImage:highlightedBackgroundImage forState:UIControlStateHighlighted]; _button.titleLabel.font = [theme contactButtonFont]; [_button setTitleColor:[theme contactButtonTextColor] forState:UIControlStateNormal]; [_button setTitleEdgeInsets:UIEdgeInsetsMake(4, 6, 4, 6)]; NSString *tokenString = ([allTrim(mcContact.name) length]>0) ? mcContact.name : mcContact.eMail; [_button setTitle:tokenString forState:UIControlStateNormal]; [_button addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside]; CGSize size = [tokenString sizeWithFont:[theme contactButtonFont]]; size.width += 20; if (size.width > 200) { size.width = 200; } size.height = normalBackgroundImage.size.height; [_button setFrame:CGRectMake(0, 0, size.width, size.height)]; self.frame = _button.frame; [self addSubview:_button]; } return self; } - (void)buttonClicked:(id)sender { [self.delegate contactViewButtonClicked:self]; } /* // Only override drawRect: if you perform custom drawing. // An empty implementation adversely affects performance during animation. - (void)drawRect:(CGRect)rect { // Drawing code } */ @end 

У вас довольно очевидная проблема, связанная с вашим методом dealloc: [super dealloc]; должен быть вызван в EN EN вашей реализации, иначе строка после этого попытается получить доступ к пространству памяти (пространство ivar), которое уже освобождено, поэтому оно будет аварийно завершено.

Для другой проблемы, я не уверен, что это хорошая идея, чтобы включить мониторинг активности в качестве подпрограммы кнопки в целом …

  • NSDateFormatter dateFromString возвращает nil
  • Что мне нужно сделать, чтобы заставить Core Data автоматически переносить модели?
  • Ссылка с UITableViewCell на родительский UITableView?
  • Ошибка сборки Xcode «Неопределенные символы для архитектуры x86_64»
  • Декларация о свойствах и автоматическое резервирование хранилища
  • Понимание подсчета ссылок с помощью Cocoa и Objective-C
  • Как получить размер NSString
  • установить фоновое изображение для всего приложения iPhone / iPad
  • Установка UIDatePicker в таблицу UIActionSheet
  • Не удалось добавить объекты в NSMutableArray в Objective C
  • Изменение цвета фона в UIAlertView?
  • Interesting Posts

    Почему не удается выполнить внутриуровневые тесты кода, чтобы найти ресурсы пакета?

    Как работает алгоритм HyperLogLog?

    Завершение Bash для команд в Mac OS X

    Есть ли преимущество использования карты над unordered_map в случае тривиальных ключей?

    Доступ к «этому» из анонимного classа Java

    Добавление раздела NTFS на диск в Windows делает раздел HFS + на том же диске невидимым в Mac OS X

    Regex, созданный с помощью нового RegExp (myString), не работает (обратная косая черта)

    как использовать UIScrollView в Interface Builder?

    Странное поведение Class.getResource () и ClassLoader.getResource () в исполняемой банке

    Внутренняя регистрация в cassandra CQL

    Как отключить JavaScript в инструментах разработчика Chrome

    Android: Генерировать случайный цвет при нажатии?

    Точная резервная копия диска или синхронизация файлов и папок, поддерживающая метаданные

    Каков наилучший метод для принудительного истечения кеша в ASP.NET?

    Почему Java API использует int вместо короткого или байтового?

    Давайте будем гением компьютера.