2016-02-17 19 views
7

Tôi thêm UILabel (số tiền nhãn) vào UIViewController trong trình chỉnh sửa bảng phân cảnh. Và sau đó trong tập tin nhanh chóng, viewDidLoad, tôi lập trình tạo một UITextField (paymentTextField) và cố gắng thêm một ràng buộc giữa amountLabelpaymentTextField. Đây là mã của tôi trong viewDidload:Swift thêm ràng buộc theo chương trình

let paymentTextField = UITextField() 
    paymentTextField.translatesAutoresizingMaskIntoConstraints = false 
    paymentTextField.frame = CGRectMake(15, 100, CGRectGetWidth(self.view.frame) - 30, 44) 
    self.view.addSubview(paymentTextField) 

    let bottonConstraint = NSLayoutConstraint(item: paymentTextField, attribute: NSLayoutAttribute.Bottom, relatedBy: NSLayoutRelation.Equal, toItem: self.amountLabel , attribute: NSLayoutAttribute.Top, multiplier: 1, constant: 30) 
    bottonConstraint.identifier = "paymentTextFieldSpacing" 
    NSLayoutConstraint.activateConstraints([bottonConstraint]) 

Nhưng tôi nhận được một lỗi:

"Terminating app due to uncaught exception 'NSGenericException', reason: 'Unable to activate constraint with items > and > because they have no common ancestor. Does the constraint reference items in different view hierarchies? That's illegal."

Có ai biết những gì là sai? amountLabel được kéo trực tiếp vào chế độ xem trong bảng phân cảnh và "paymentTextField" được thêm theo chương trình vào cùng một chế độ xem. Tại sao họ không có tổ tiên chung?

Trả lời

4

Lỗi nói rằng "bởi vì chúng không có tổ tiên chung", có nghĩa là chúng không chia sẻ cùng một cha mẹ. Để liên kết ràng buộc giữa hai mục, họ phải có mối quan hệ cha-con hoặc anh chị em ruột.

Trong trường hợp của bạn, hãy đảm bảo họ có cùng chế độ xem gốc trước khi thêm ràng buộc theo chương trình.

+1

Cảm ơn câu trả lời của bạn. Tôi không thể tìm ra cách để cung cấp cho AmountLabel và paymentTextField cùng một phụ huynh. Tôi đã kéo AmountLabel trong bảng phân cảnh và cha mẹ của nó phải là chế độ xem bên ngoài. Tôi đã thêm paymentTextField lập trình vào self.view và cha mẹ của nó cũng phải là dạng xem bên ngoài. Làm thế nào họ có cha mẹ khác nhau? – jimshicard

+1

Bạn đã xác nhận rằng họ có cùng cha mẹ, như in paymentTextField.superview? Nếu không, chỉ cần kéo một IBOutlet từ khung nhìn bên ngoài kịch bản vào bộ điều khiển và sử dụng nó để thêm paymentTextField làm một khung nhìn con. Ngoài ra, hãy đảm bảo bạn đang thêm ràng buộc SAU cuộc gọi addSubview, không phải trước đó. – Pauls

40

Tôi đã gặp phải sự cố tương tự mà bạn đã mô tả trước đó. Để tạo subview có lập trình, (trong trường hợp của bạn là paymentTextField), bạn phải thêm nó vào subview trước và sau đó áp dụng các ràng buộc của bạn.

Bằng cách thêm chế độ xem con để xem trước, điều này đảm bảo cả hai chế độ xem đều có cùng một cấp độ gốc.

Rất muộn, nhưng hy vọng điều này sẽ giúp bất kỳ ai khác.

+0

Tôi có thể xác minh điều này. Nó xảy ra với tôi khi tôi cố gắng kích hoạt các ràng buộc nhưng quên thêm các bản xem trước vào chế độ xem siêu. – christostsang

8

Danh sách kiểm tra cho vấn đề này:

  • Kiểm tra xem bạn thêm quan điểm lập trình tạo ra để mẹ trước những hạn chế kích hoạt
  • Kiểm tra xem bạn viết những hạn chế mã kích hoạt bên trong viewDidLoad()/viewWillAppear(). Bạn nên viết mã kích hoạt ràng buộc trong updateViewConstraints hoặc viewWillLayoutSubviews. (suggested by vmeyer)
  • Kiểm tra xem bạn có tắt dịchAutoresizingMaskIntoConstraints.
Các vấn đề liên quan