Как подклассифицировать элементы пользовательского интерфейса, такие как UILabel, UIButton

Я подклассифицирую UILabel в CustomLabel class . У меня проблемы, когда я пытаюсь использовать простой UILabel и я буду подклассифицировать другие элементы в будущем. Я прочитал, что могу создать category UILabel . Что из этого лучше? категории или подкласса?

Вот мой код, пытающийся подкласс. Он не работает в методе setFont .

 @interface WPCustomLabel : UILabel @property (strong, nonatomic) UIColor *color; @property (strong, nonatomic) UIFont *font; @end #import "WPCustomLabel.h" @implementation WPCustomLabel - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { [self setBackgroundColor:[UIColor clearColor]]; } return self; } -(void)setColor:(UIColor *)color { self.color = color; } -(void)setFont:(UIFont *)font { self.font = font; } @end 

и я вызываю эту CustomLabel в моем ViewController.

 @property (strong, nonatomic) WPCustomLabel *titleLbl; titleLbl = [[WPCustomLabel alloc] initWithFrame:CGRectMake(75, 25, 200, 14)]; [titleLbl setTextColor:[UIColor blackColor]]; [titleLbl setFont:[UIFont systemFontOfSize:14]]; [titleLbl setBackgroundColor:[UIColor clearColor]]; [titleLbl setText:@"Here I AM"]; [self.view addSubview:titleLbl]; 

4 Solutions collect form web for “Как подклассифицировать элементы пользовательского интерфейса, такие как UILabel, UIButton”

Как подклассифицировать элементы пользовательского интерфейса, такие как UILabel, UIButton

Никоим образом не.

Я прочитал, что могу создать категорию UILabel

Это верно. На самом деле, если вы хотите расширить класс, скорее всего, вы должны использовать категорию (см. Предыдущий ответ).

Он не работает в методе setFont.

Вы не указали, как это «не удается», но все, что я могу догадаться, в результате приводит к бесконечной рекурсии и ошибке переполнения / сегментации стека. Это потому что

 self.font = font; 

эквивалентно

 [self setFont:font]; 

Таким образом, вы вызываете метод из себя, безоговорочно.

Если вам не нужно настраивать поведение этих свойств, просто оставьте его. 🙂 Если да, то просто вызовите реализацию суперкласса, когда вы закончите:

 - (void)setFont:(UIFont *)font { [self doScaryCustomMagicStuff]; [super setFont:font]; } 

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

Ваша проблема здесь в том, что в сеттерах вы вспоминаете сеттеров:

 -(void)setFont:(UIFont *)font { self.font = font; } 

компилируется в (это то же самое):

 -(void)setFont:(UIFont *)font { [self setFont:font]; } 

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

 // LOOK AT EDIT -- Do not do this for 'font' -(void)setFont:(UIFont *)font { _font = font; } 

РЕДАКТИРОВАТЬ:

Я не думал прямо. Поскольку вы подклассифицируете UILabel вас уже есть свойство font . Вы не должны указывать это напрямую, поскольку ваш суперкласс ( UILabel ) уже имеет его. Поэтому избавитесь от этих объявлений свойств. При этом, если color не нужен, категория, вероятно, станет лучшим решением для вас. Несмотря на это, вы можете переопределить свой setFont: :

 -(void)setFont:(UIFont *)font { [super setFont:font]; // do custom stuff } 

И поскольку color не является свойством UILabel вы должны установить его через переменную экземпляра (например, выше: _color = color ), не вызывайте super на этом UILabel так как UILabel не отвечает на него.

UILabel реализацию UILabel , поскольку вы являетесь подклассом этого.

Вы должны использовать категории, если хотите расширить функциональность элемента; например добавление функции в UILabel, которую может выполнять любой UILabel в приложении.

Но, если вы хотите использовать аналогичные UILabels в нескольких местах вашего приложения, чем вы должны подклассифицировать UILabel, измените его соответствующим образом в initWithFrame или awakeFromNib и используйте свою собственную реализацию везде, где вы этого хотите.

В вашем случае я предлагаю подклассифицировать его. Метод SetFont уже существует в стандартном UILabel, и вы можете использовать setTextColor вместо setColor.

Я не знаю о UIButton, но, согласно Apple, UILabel может свободно настраиваться подклассом. Из документации Apple:

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

  • Пользовательский UIView с динамической высотой на раскадровке
  • Создание анимированных текстовых эффектов с помощью NSLayoutManager?
  • Как сделать курсивом UILabel без заботы о размере?
  • У UIImage есть эквивалент myLabel.hidden = YES?
  • Можем ли мы получить имя UILabel?
  • Тип растяжения и кернинга, не работает в Раскадке с @IBDesignable
  • Изменение выравнивания ULabel TableView при прокрутке
  • Почему мое время UILabels пропускает 2 секунды, когда возобновляет игру из состояния паузы?
  • Мигающий эффект на UILabel
  • Как добавить интерактивные UILabels поверх UIImageView?
  • Можем ли мы добавить дополнительные UILabels в UINavigation Bar помимо его названия?
  • Interesting Posts

    как извлечь местоположение из PFGeopoint – (Parse.com и Swift) и показать его на карте с помощью Xcode 6.2

    Даты в UIDatepicker не отображаются должным образом

    Xcode 6 Storyboard Unwind Segue с быстрым не подключением к выходу

    Ошибка входа в диалоговое окно Facebook

    Можно ли добавить маркер к инструментам из кода?

    Отключить клавиатуру на UITextField с помощью Interface Builder

    prepareForSegue не вызывается из пользовательского uitableviewcell

    Разработка пользовательского интерфейса iOS: подход к созданию документа «селекторный экран»

    Что мне нужно сделать, чтобы получить функцию, вызванную в оптимизированном коде компилятора?

    Как читать файл Xcode 6.1 Instruments .trace?

    Как использовать appendFormat для форматирования строки в Swift?

    Приложение PhoneGap, использующее как Media API, так и API Web Audio, отключается при начале записи

    Почему URL-адрес общего ресурса Pinterest не создает богатый вывод только на iOS Safari?

    используя navigator.geolocation в UIWebView с локальным html-файлом

    UIReferenceLibraryViewController в popover

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.