2013-06-27 26 views
5

Tôi muốn xác định một macro để thống nhất tất cả các phông chữ trong ứng dụng của tôi:Xác định vĩ mô cho UIFont không hoạt động

#define EXO_REGULAR_FONT(size) [UIFont fontWithName:@"Exo-Regular" size:size] 

và vì sử dụng macro này như thế này:

myLabel.font = EXO_REGULAR_FONT(15); 

Nhưng trình biên dịch Hãy cho tôi lỗi này:

enter image description here

(có một mũi tên dưới 15).

Bất kỳ ý tưởng nào cần giải quyết? Cảm ơn

Trả lời

12

Thay đổi tên của tham số của bạn:

#define EXO_REGULAR_FONT(theFontSize) [UIFont fontWithName:@"Exo-Regular" size:theFontSize] 

Từ GCC manual:

When the macro is expanded, each use of a parameter in its body is replaced by the tokens of the corresponding argument

Vì vậy, khi macro của bạn được mở rộng, nó chèn này trong mã của bạn, vì thế mà lỗi biên dịch:

[UIFont fontWithName:@"Exo-Regular" 15:15] 
4
#define EXO_REGULAR_FONT(size) [UIFont fontWithName:@"Exo-Regular" size:size] 

được mở rộng, khi bạn gọi EXO_REGULAR_FONT(15), để

[UIFont fontWithName:@"Exo-Regular" 15:15] 

Vì vậy, bạn cần phải xác định nó như thế này ví dụ:

#define EXO_REGULAR_FONT(_size_) [UIFont fontWithName:@"Exo-Regular" size:_size_] 
3
#define EXO_REGULAR_FONT(s) [UIFont fontWithName:@"Exo-Regular" size:s] 
5

Không sử dụng một macro; họ là kẻ xấu (bạn vừa trải qua một trong nhiều lý do).

Sử dụng chức năng thay vì:

static inline UIFont *ExoRegularFont(CGFloat size) { 
    return [UIFont fontWithName:@"Exo-Regular" size:size]; 
} 
+0

Sẽ là xấu thực hành để ghi nhớ điều này một cái gì đó tương tự như macros.h và đính kèm nó trong pch của bạn? – BooRanger

+0

@BooRanger Không hề. Chắc chắn tốt hơn và an toàn hơn '# define'. –

+1

một danh mục trên UIFont cũng sẽ là một cách hay để xử lý phông chữ tùy chỉnh. Tương tự như '+ systemFontOfSize:' Tôi sử dụng '+ appFontOfSize:', '+ boldAppFontOfSize:', '+ headingFont', ... trong các ứng dụng của tôi. –

Các vấn đề liên quan