2013-02-28 24 views
13

Tôi có một UIView trên trình tạo giao diện. Trong bộ điều khiển xem của tôi, tôi có một số IBOutlet MyUIView trỏ đến UIView trên trình tạo giao diện.Phân lớp UIView. phương pháp init không bao giờ được gọi là

Tôi đã thay đổi lớp của UIView thành "MyUIView" (lớp UIView tùy chỉnh) nhưng có vẻ như không có phương pháp nào trong số các phương thức init của lớp con được kích hoạt.

Tôi đang làm gì sai?

+1

bạn có thể hiển thị mã của mình như thế nào bạn làm việc đó không? – nsgulliver

+0

Không có gì thực sự trong mã! Trong trình xây dựng giao diện, tôi chọn UIView và đặt lớp thành "ShadowView". Tôi đã đặt các điểm ngắt trong phương thức init của ShadowView nhưng nó không bao giờ đi vào các phương thức đó. –

Trả lời

25

Thay vì init bạn cần phải gọi initWithCoder đầu tiên sau đó gọi init như:

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

- (void)baseClassInit { 

    //initialize all ivars and properties  
} 
+0

Cảm ơn tôi sẽ kiểm tra xem nó ra! –

+0

Bạn cũng cần * triển khai * 'initWithCoder:', như mã đó. Đơn giản chỉ cần gọi nó từ một số nơi ngẫu nhiên trong khi ghi đè 'init' một mình sẽ không thực hiện công việc. –

20

Câu trả lời ngắn: bạn cần phải sử dụng initWithCoder:.

Từ initWithFrame: tài liệu:

Nếu bạn sử dụng giao diện Builder để thiết kế giao diện của bạn, phương pháp này không được gọi khi đối tượng xem bạn đang sau đó tải từ tập tin nib. Các đối tượng trong một tập tin nib được tái tạo và sau đó khởi tạo bằng cách sử dụng phương thức initWithCoder:, nó sửa đổi các thuộc tính của khung nhìn để phù hợp với các thuộc tính được lưu trữ trong tệp nib.

Nếu bạn đang sử dụng tệp nib/xib/Storyboard, hãy sử dụng initWithCoder:. Nếu bạn đang tạo chế độ xem của mình theo chương trình, bạn có thể sử dụng init hoặc initWithFrame:.