2015-01-23 14 views
6

Tôi luôn sử dụng phương thức loadNibNamed để tải chế độ xem tùy chỉnh vào bộ điều khiển chế độ xem, nhưng giờ tôi đang cố tránh gọi phương thức đó bên ngoài chế độ xem tùy chỉnh hơn tái sử dụng để nếu một người khác sử dụng giao diện tùy chỉnh của tôi anh sẽ chỉ cần phải nhanh chóng quan điểm mà không loadFromNib, ví dụ:Tuỳ chỉnh UIView với Nib nhanh chóng mà không sử dụng loadFromNib trong bộ điều khiển xem

var myView: MyView = MyView() 

Và thêm quan điểm này để xem bộ điều khiển quan điểm của sẽ là đủ, quan điểm tùy chỉnh sẽ được tải nib bên trong chính nó. Tôi đang cố gắng để làm điều đó trong Swift, trong ObjC tôi đã tìm thấy mã như một trong những câu trả lời này: UIView and initWithFrame and a NIB file. How can i get the NIB file loaded? Nhưng nhanh chóng tôi không thể sử dụng init được sử dụng trong câu trả lời:

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     // Initialization code. 
     // 
     [[NSBundle mainBundle] loadNibNamed:@"MyView" owner:self options:nil]; 
     [self addSubview:self.view]; 
    } 
    return self; 
} 

tôi có phương pháp này và nó kết thúc với một vòng lặp vô hạn:

override init(frame: CGRect) { 
    super.init(frame: frame) 
    self.loadFromNibNamed("MyView") 
} 

tôi cũng đã thử thêm một cái nhìn bên trong MyView như một IBOutlet như câu trả lời khác nói và sử dụng tất cả các tệp kê:

@IBOutlet var view: UIView! 

override init() { 
    super.init() 
    NSBundle.mainBundle().loadNibNamed("MediaPlayerView", owner: self, options: nil) 
    self.addSubview(self.view) 
} 

override init(frame: CGRect) { 
    super.init(frame: frame) 
    NSBundle.mainBundle().loadNibNamed("MediaPlayerView", owner: self, options: nil) 
    self.addSubview(self.view) 
} 

required init(coder aDecoder: NSCoder) { 
    super.init(coder: aDecoder) 
    NSBundle.mainBundle().loadNibNamed("MediaPlayerView", owner: self, options: nil) 
    self.addSubview(self.view) 
} 

Nhưng vẫn có lỗi của vòng lặp vô hạn.

Tôi không thể tìm được giải pháp tốt cho điều đó và điều đó khiến tôi phát điên! Ai đó có thể giúp tôi? Cảm ơn!

+0

Liệu NIB của bạn có chứa một cái nhìn của lớp 'MyView' hoặc 'MediaPlayerView', resp.? Đây có thể là lý do của vòng lặp vô hạn, và tôi đoán 'init (coder:) 'là nguyên nhân. – clemens

Trả lời

0

Tôi nghĩ rằng cách tiếp cận rõ ràng hơn là không phải sử dụng trình khởi tạo mặc định, nhưng sử dụng ví dụ của riêng bạn, ví dụ: như thế này

override init(frame: CGRect, shouldLoadFromNib: Bool) { 
    super.init(frame) 
    guard shouldLoadFromNib else { 
     return 
    } 
    NSBundle.mainBundle().loadNibNamed("MediaPlayerView", owner: self, options: nil) 
    self.addSubview(self.view) 

} 

Bằng cách này, khi bạn đang instantiating nó từ một nơi khác, bạn sẽ thấy ngay rằng đây không phải chỉ là instantiation cũ đồng bằng của một số UIView nhưng mà nó có tác dụng phụ (mà quan điểm sẽ nạp từ một nib)

tôi không chắc chắn về super.init(frame) cuộc gọi, nó có thể là loadNibNamed cũng sẽ gọi điều đó cho bạn, vì vậy bạn có thể muốn kiểm tra xem ra

0

bạn đang nhận được một vòng lặp vô hạn, bởi vì loadNibNamed(_,owner:,options:) gọi số init, s o sau đó cố gắng tải lại nib, và một lần nữa một vân vân ... Hãy thử điều này:

Swift 4

var contentView: UIView? 

// MARK: Initializers 

override init(frame: CGRect) { 
    super.init(frame: frame) 
    configureView() 
} 

required init?(coder aDecoder: NSCoder) { 
    super.init(coder: aDecoder) 
    configureView() 
} 

override func prepareForInterfaceBuilder() { 
    super.prepareForInterfaceBuilder() 
    configureView() 
} 

override func awakeFromNib() { 
    super.awakeFromNib() 
    configureView() 
} 

// MARK: Config Functions 

func configureView() { 
    guard let view = defaultView() else { return } 
    view.frame = bounds 
    view.autoresizingMask = [.flexibleWidth, .flexibleHeight] 
    addSubview(view) 
    contentView = view 

    updateView() 
} 

func defaultView() -> UIView? { 
    // Create view from a nib with the same name 
    let nibName = String(describing: type(of: self)) 
    let bundle = Bundle(for: type(of: self)) 
    let nib = UINib(nibName: nibName, bundle: bundle) 

    return nib.instantiate(withOwner: self, options: nil).first as? UIView 
} 

gì mã này không, là nạp nhìn từ ngòi bút, một sau đó thêm nó vào một chế độ xem phụ bên trong chế độ xem của bạn.

này sẽ làm việc cũng có khi thêm cái nhìn của bạn trên xibs khác, thêm @IBDesignable và nó sẽ trở nên có sẵn

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