2013-03-01 25 views
9

Tôi đang cố gắng tạo một tùy chỉnh UIView mang lại chế độ xem từ một tệp nib.nhầm lẫn về initWithCoder và UIViews tùy chỉnh

Trong điều khiển của tôi, tôi có một cái gì đó như:

self.arcView=[[JtView alloc] initWithCoder:self]; 
self.arcView.backgroundColor=[UIColor redColor]; 
self.arcView.frame=CGRectMake(30.0f,200.0f, 100.0f, 100.0f); 
[self.view addSubview:self.arcView]; 

câu hỏi đầu tiên của tôi là những gì nên đi vào các đối số cho initWithCoder (NSCoder *)? Tôi đã cố gắng tự nhưng có một loại con trỏ không tương thích nhưng điều này dường như làm việc. Nhưng đối với câu hỏi # 2:

Thứ hai, đối số là bạn sử dụng initWithCoder với nibsinitWithFrame khi đặt chế độ xem tùy chỉnh trong một khung. Vâng, tôi muốn tải nib trong chế độ xem tùy chỉnh của tôi và sau đó đặt nó vào một khung. Tôi có thể chỉ cần thêm một khung như trên và nó ok (có vẻ như nó hoạt động)?

+0

Hãy xem tại đây và xem mẫu mã stackoverflow.com/a/17798646/381807 - nesimtunc – nesimtunc

Trả lời

9

Bạn đang làm nó theo cách khác xung quanh: nó không phải là bạn của những người nên gọi initWithCoder:, đó là việc thực hiện các phương pháp loadNibNamed:owner: nào đó.

Những gì bạn cần làm trong mã của bạn được gọi

UIView *view = [[[NSBundle mainBundle] loadNibNamed:@"theNIB" 
               owner:self 
              options:nil] objectAtIndex:0]; 

này sẽ không nhóm các NIB, và gọi initWithCoder: initializer của bạn, và cung cấp cho bạn một cái nhìn trở lại với tất cả các cửa hàng được kết nối.

+0

Phương pháp này không trả về một 'NSArray' của tất cả các đối tượng cấp cao nhất trong NIB? Điều gì nếu 'UIView' không phải là đầu tiên? – borrrden

+0

thx, làm việc thông qua điều này ngay bây giờ. Tôi đã hỏi một câu hỏi khác (xin lỗi vì đã gửi spam nhưng tôi cảm thấy mình phải hiểu điều này). – timpone

9

initWithCoder được gọi nhiều trước initviewDidLoad phương pháp. Và bạn không bao giờ gọi nó. Nó được gọi khi bạn tải một tập tin nib từ mainBundle của bạn.

Tuy nhiên, nó nhận được NSCoder làm đối số. Hãy xem cách nó được gọi là trong một lớp học:

- (id)initWithCoder:(NSCoder *)aDecoder { 
    if ((self = [super initWithCoder:aDecoder])) { 
     [self baseClassInit]; 
    } 
    return self; 
} 

- (void)baseClassInit { 

    //initialize all ivars and properties  
} 
+0

điều này có vẻ là ý tưởng đúng. – timpone

1
self.arcView = [[[NSBundle mainBundle] loadNibNamed:@"JtView" owner:self options:nil] objectAtIndex:0]; 
self.arcView.frame = CGRectMake(30.0f,200.0f, 100.0f, 100.0f); 
self.arcView.backgroundColor = [UIColor redColor]; 
[self.view addSubview:self.arcView]; 

Điều đó sẽ hoạt động và không gọi initWithCoder:.

1

Không bao giờ gọi initWithCoder một cách rõ ràng, nó được gọi ngầm trong khi hủy lưu trữ đối tượng và khởi tạo đối tượng ivars và properties- Lưu trữ đối tượng có thể là lớp mô hình tùy chỉnh của bạn được lưu trong lưu trữ kiên trì hoặc chế độ xem tùy chỉnh được tải từ tệp xib.

Trong lớp học, có vẻ như bạn đang cố gắng tạo chế độ xem tùy chỉnh, do đó, tải nó từ tệp xib, để tham khảo mã @dasblinkenlight là giải pháp hoàn hảo.