2012-05-25 3 views
2

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

Вещь, которую я сейчас делаю, является более практичным вопросом, где я не уверен, как это должно быть реализовано .. Я пишу категорию на UIActivityIndicatorView, которая в основном будет использоваться для отображения индикатора активности в произвольном виде. Ниже вы найдете пример кода, как я это делаю, и мой главный вопрос: насколько это хорошо. И я был бы признателен за комментарии по поводу того, почему это плохо, если это так. Благодарю.

Категория:

@interface UIActivityIndicatorView (Customizations) 
    - (UIActivityIndicatorView *) inView:(UIView *) target; 
@end 

Реализация:

@implementation UIActivityIndicatorView (Customizations) 

- (UIActivityIndicatorView *) inView:(UIView *) target { 
    [self startAnimating]; 
    [self setHidden:NO]; 
    self.frame = target.bounds; 
    self.backgroundColor = [UIColor colorWithRed:0.0f green:0.0f blue:0.0f alpha:0.6f]; 

    return self; 
} 
@end 

Тогда я хотел бы использовать его как это:

[background addSubview:[loader inView:background]]; 

Я предполагаю, что другой способ сделать это - сделать функцию инициализации, чтобы отобразить представление контейнера и просто вернуть «стиль», или, возможно, не вернуть ничего (void), и просто позволить методу делать стиль.

Так что я ищу некоторые рекомендации относительно того, как с этим справиться.

+0

я не получаю где вы делаете вторую копию «UIActivityIndicatorView». (?) В противном случае я бы предложил только передать 'CGRect' вместо' UIView', так как это все методы из 'target'. –

+0

Да, «вторая копия» была лишь некоторой путаницей с моей стороны. Я отредактирую это, потому что это смущает любого, кто читает вопрос. О отправке 'CGRect' вместо' UIView' Я согласен, что это хорошее предложение, спасибо за это. – qrikko

ответ

4

Каких меня беспокоит то, что я на самом деле делает вторую копию UIActivityIndicatorView, которые кажутся ненужными

Нет, вы не знаете. Вас может смутить тот факт, что вы возвращаете себя из своего метода категории, но это всего лишь указатель, а не сам объект, который копируется.

Однако, я бы реализовать его немного иначе:

- (void) addToSuperView:(UIView *) target { 
    [self startAnimating]; 
    [self setHidden:NO]; 
    self.frame = target.bounds; 
    self.backgroundColor = [UIColor colorWithRed:0.0f green:0.0f blue:0.0f alpha:0.6f]; 

    [target addSubview:self]; 
} 

Таким образом, вам не нужно делать дополнительный, ненужный вызов при добавлении его:

[loader addToSuperView:background]; 
+0

А, так вы, в замешательстве. И это имеет смысл. Мое мышление состояло в том, что это может вызвать у меня хлопот при удалении его, чтобы добавить его туда. Но опять же, думая немного больше, я вижу, что это не проблема, так что эта реализация будет прекрасно! Спасибо за помощь. (ps. смотря на это, это так много ** чище!) – qrikko

Смежные вопросы