2012-10-08 34 views
6

Tôi đang cố gắng tạo kiểu cho tất cả các trường văn bản như vậy:Phong cách tất cả các UITextField cùng một lúc chứ không phải trong mỗi ViewController?

CGRect frameRect2 = _lastname_field.frame; 
frameRect2.size.height = 30; 

_lastname_field.font = [UIFont fontWithName:@"AppleGothic" size:15]; 
_lastname_field.frame = frameRect2; 
_lastname_field.backgroundColor= [UIColor whiteColor]; 
_lastname_field.layer.cornerRadius = 5.0; 
[_lastname_field.layer setBorderColor: [[UIColor grayColor] CGColor]]; 
[_lastname_field.layer setBorderWidth: 1.0]; 
_lastname_field.clipsToBounds = YES; 

Trường đó trông tuyệt vời. Chỉ có vấn đề là, có hơn 50 textfields trong suốt ứng dụng. Có cách nào dễ dàng để tạo kiểu cho tất cả chúng theo cùng một cách không? Một số trong số họ thậm chí không được tổng hợp/đặt tên.

Cảm ơn!

Trả lời

9

1) Nếu bạn tạo tập tin của bạn trong mã của bạn, tôi sẽ tạo ra một lớp nhà máy với một giao diện như thế:

@interface MyTextFieldFactory : NSObject 
+ (UITextField*)createStyledTextField; 
@end 

2) Nếu bạn tạo Trường văn bản của bạn với giao diện Builder, bạn có thể viết một danh mục trên UITextField, chỉ thực hiện awakeFromNib:. Ở đó bạn thực hiện tất cả các tùy chỉnh của bạn. Điều này không cần thay đổi mã, cũng không cần thay đổi trong các tệp nib.

2

Bạn sẽ có thể làm điều này cho tất cả các thuộc tính ngoại trừ những thứ lớp ...

trong appdelegate bạn thêm một phương pháp giống như ...

- (void)changeAppearances 
{ 
    [[UITextField appearance] setFont:[UIFont fontWithName:@"AppleGothic" size:15]]; 
    [[UITextField appearance] setBackgroundColor:[UIColor whiteColor]]; 
} 

và vân vân.

Điều này sẽ đặt giao diện cho tất cả các phiên bản UITextField trong ứng dụng của bạn. (miễn là bạn không ghi đè lên chúng trong mã của bạn).

+1

hmm ... công cụ lớp có lẽ là tùy chỉnh quan trọng nhất ở đây. Không chắc chắn nếu điều này sẽ làm việc – Rohan

+0

Thêm một câu trả lời mới mà không yêu cầu phân lớp. Subclassing là tốt nhất để tránh với các điều khiển như thế này nếu có thể. – Fogmeister

+0

cách chúng ta có thể tạo kiểu cho các thuộc tính lớp từ AppDelegate? – dev27

3

Phân lớp UITextField và thêm tùy chỉnh của bạn trong phương thức initWithFrame. Thêm phương thức initWithCoder vào lớp tùy chỉnh nơi bạn gọi siêu và trả về [self initWithFrame: [self frame]]. Sau đó thay đổi lớp trong Trình tạo giao diện cho mỗi trường văn bản.

Nó sẽ là một cái gì đó như thế này:

// MyUITextField.h 
@interface MyUITextField : UITextField { 
    // Your IVars 
} 

@property (retain, readonly) float value; 
@end 

// MyUITextField.m 
@implementation MyClass 

- (id)initWithCoder:(NSCoder *)decoder { 

    [super initWithCoder:decoder]; 
    return [self initWithFrame:[self frame]]; 
} 

- (id)initWithFrame:(CGRect)frame { 

    self = [super initWithFrame:frame]; 
    if (self) { 
     // Your customization 
    } 
} 

@end 
+0

Bạn có thể phân lớp nó để lấy các phương thức lớp nhưng tôi khuyên bạn nên sử dụng các phương thức xuất hiện cho hầu hết các phương thức đó. – Fogmeister

+0

Vẫn còn khá mới đối với iOS, bạn có thể liên kết tôi đến các tài nguyên trên phân lớp phụ không? Tôi biết làm thế nào để thay đổi các lớp học trong IB, nhưng không hoàn toàn theo bạn 100% trên các bước khác bạn đề nghị – Rohan

+0

Ở đây bạn đi: http://developer.apple.com/library/ios/#documentation/cocoa/conceptual /objectivec/chapters/occategories.html Phản hồi được cập nhật ;-) – atxe

1

OK, nếu xuất hiện sẽ không làm việc sau đó đặt cược tốt nhất tiếp theo của bạn là viết một thể loại để làm điều này cho bạn.

Phân lớp là có thể nhưng không lý tưởng vì có khả năng ghi đè điều gì đó bạn không nên (hoặc ngược lại).

Thêm tệp vào dự án của bạn và chọn loại Danh mục và đặt lớp là UITextField.

Trong bảng xếp hạng thêm một chức năng giống như ...

- (void)configureTextFieldWithFrame:(CGRect)frame; 

Sau đó trong file .m bạn có thể có ...

- (void)configureTextFieldWithFrame:(CGRect)frame 
{ 
    self.font = [UIFont fontWithName:@"AppleGothic" size:15]; 
    self.frame = frame; 
    self.backgroundColor= [UIColor whiteColor]; 
    self.layer.cornerRadius = 5.0; 
    [self.layer setBorderColor: [[UIColor grayColor] CGColor]]; 
    [self.layer setBorderWidth: 1.0]; 
    self.clipsToBounds = YES; 
} 

Sau đó, bạn chỉ cần #import UITextField+Configure.h (hoặc bất kỳ categoyr của bạn được gọi là

Sau đó, trong mã của bạn, hãy thay thế mã của bạn bằng ...

[_lastname_field configureTextFieldWithFrame:frameRect2]; 

Thao tác này sẽ chạy chức năng danh mục của bạn.

1

Tôi đồng ý với Fogmeister cho các trường văn bản được tạo bằng mã. Nhưng nếu bạn đang đặt ra các trường văn bản trong Storyboards, cách tiếp cận đó sẽ không hoạt động (vì mỗi trường xác định rõ ràng các thuộc tính của nó). Nhưng có một cách dễ dàng không hoạt động.

Nhấp chuột phải vào bảng phân cảnh của bạn và "Mở dưới dạng .." Mã nguồn. Điều đó đặt một biểu diễn XML của SB lên một cửa sổ trình soạn thảo. Ở đó bạn có thể thay đổi các thuộc tính textfield trên toàn cầu (và/hoặc chọn lọc) bằng cách sử dụng trình soạn thảo (hoặc sao chép vào trình soạn thảo XML mà bạn chọn).

Cảnh báo công bằng, có thể giết dự án của bạn nếu bạn giới thiệu các lỗi trong SB sẽ giữ nó khỏi biên dịch - vì vậy hãy cẩn thận và đảm bảo bạn có bản sao lưu cho SB của mình. Nhưng nếu bạn kiểm tra sau mỗi thay đổi, kỹ thuật này có thể hoạt động rất tốt.

Tìm kiếm "<textField" để tìm một cái gì đó như thế này:

<textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="name" minimumFontSize="17" clearButtonMode="whileEditing" id="F9N-Tb-KTd"> 
          <rect key="frame" x="176" y="301" width="472" height="31"/> 
          <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/> 
          <fontDescription key="fontDescription" type="system" pointSize="14"/> 
          <textInputTraits key="textInputTraits" autocapitalizationType="words" enablesReturnKeyAutomatically="YES"/> 
          <connections> 
           <action selector="changeName:" destination="4" eventType="editingDidEnd" id="bLg-iM-m8a"/> 
          </connections> 
         </textField> 

Tìm một textfield có các thuộc tính fontDescription bạn thích, và một trong đó không. Sau đó, thay thế các thuộc tính fontDescription mà bạn muốn thay đổi với các thuộc tính tương ứng từ thuộc tính tốt nhất. Hãy chắc chắn giới hạn các thay đổi của bạn đối với những thứ như phông chữ, kích thước và nền. Không thay đổi id, rect hoặc bất kỳ thứ gì khác cần phải là duy nhất cho textfield.

Tôi hy vọng điều này phù hợp với bạn, đó là một kỹ thuật rất tiện dụng cho tôi để đảm bảo tất cả các trường văn bản của tôi có kiểu chữ nhất quán.

(Để quay trở lại xem bình thường, "Open As ..." Interface Builder - Storyboard)

Chúc may mắn!

+0

tuyệt vời để biết! Thật không may, tôi có tất cả các bố trí giao diện của tôi trong ngòi riêng biệt, không phải là một bảng phân cảnh (đã cho chúng tôi vấn đề GIT). Tôi đoán tôi có thể sửa đổi từng nib riêng lẻ? – Rohan

+0

Tôi sử dụng SB với GIT mọi lúc, bạn có thể muốn xem lại. Đối với chỉnh sửa các tập tin nib, tôi đã không thử nó. – jbbenni

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