2015-04-29 13 views
10

Tôi muốn tạo một số chế độ xem tùy chỉnh sử dụng các thẻ @IBDesignable@IBInspectable. Tôi đã thêm chúng vào Khung của tôi và sau đó liên kết Khung của tôi với ứng dụng thử nghiệm của tôi. Nhưng Designables không bao giờ xuất hiện trong StoryBoard.IBDesignable from External Framework?

Tôi làm cách nào để sử dụng @IBDesignable@IBInspectable để tạo chế độ xem tùy chỉnh từ khung bên ngoài?

Bạn có thể sử dụng @IBDesignable@IBInspectable trong một ứng dụng từ một khung không được nhúng không?

Cảm ơn bạn.

Trả lời

8

Tôi đã tìm thấy một cách để sử dụng thiết kế và kiểm tra được với khung công tác Cocoa Touch. Các hướng dẫn dưới đây dành cho một dự án Objective-C và Xcode 8 (tôi đã không thử nghiệm trên các phiên bản cũ hơn), và phải giống hệt nhau nếu mã Swift có liên quan.

Vì thiết kế không được Trình xây dựng giao diện phát hiện trong khuôn khổ, nên vô ích khi đánh dấu các lớp là IB_DESIGNABLE trong tiêu đề khuôn khổ. Interface Builder sẽ chỉ khám phá các lớp có thể thiết kế được khi biên dịch các tệp nguồn của dự án. Do đó, ý tưởng là cung cấp thông tin này dưới dạng tệp nguồn đồng hành khung, mà sau đó khách hàng có thể biên dịch với dự án của họ.

Tôi phát hiện ra rằng bạn không phải phân lớp để đánh dấu một lớp khung công tác có thể thiết kế trong một dự án. Bạn có thể cụ thể là chỉ đơn giản là chú thích mỗi lớp mà phải thể thiết kế thông qua một loại khai báo trong tập tin nguồn đồng hành .m, ví dụ:

IB_DESIGNABLE 
@interface MyCustomView (Designable) 

@end 

Trong thực tế, các mã này thậm chí không cần phải biên dịch, bạn có thể bọc nó trong một kèm theo #if 0 ... #endif và nó vẫn hoạt động. Tất cả những gì cần thiết là lớp này được liên kết với thuộc tính IB_DESIGNABLE.

Với thông tin này trong tâm trí, đây là cách để làm cho designables làm việc với các khuôn khổ Cocoa Touch:


Nếu bạn là một nhà cung cấp khuôn khổ:

  1. Nếu cần thiết, có các thành phần phải được thiết kế có thể thiết kế -prepareForInterfaceBuilder
  2. Thêm tham chiếu thư mục (thư mục màu xanh) vào mục tiêu khung của bạn, với đồng hành .m trong đó. Một quy ước đặt tên có thể là đặt tên cho thư mục Designables và tệp trong đó MyFrameworkNameDesignables.m, nhưng bạn có thể chọn bất cứ thứ gì bạn thích nhất.
  3. Trong tệp .m, hãy tạo danh mục như thể loại ở trên cho mỗi chế độ xem phải được thiết kế. Các tập tin bản thân phải compilable bởi dự án của khách hàng, có nghĩa là bạn có cần phải thực hiện nhập khẩu cần thiết (ví dụ như bạn khuôn khổ toàn cầu công tiêu đề #import <MyFramework/MyFramework.h>) hoặc sử dụng các trick #if 0 ... #endif trên

Bằng kèm tập tin trong một thư mục màu xanh, chúng tôi đảm bảo thư mục được sao chép như nằm trong sản phẩm .framework cuối cùng mà không có tệp nguồn đồng hành nào được biên dịch. Hơn nữa, vì thư mục là một phần của gói framework, nó có sẵn cho tất cả các máy khách của khung công tác, cho dù chúng có tích hợp trực tiếp hay sử dụng Carthage hay không.

Nếu bạn có dự án demo sử dụng khung làm phụ thuộc mục tiêu và nếu khung của bạn phụ thuộc vào các khung công tác khác, bạn sẽ gặp phải sự cố dlopen khi cố gắng hiển thị lượt xem có thể thiết kế trong dự án demo. Điều này là do các thuộc tính IB_DESIGNABLE được phát hiện trong mục tiêu khung (vì thư mục Designables đã được thêm vào nó), Xcode được xây dựng sẵn trong thư mục dữ liệu có nguồn gốc Build/Intermediates/IBDesignables tương ứng với dự án của bạn. Nếu bạn nhìn vào nội dung của thư mục này, phụ thuộc khung bị thiếu, dẫn đến các sự cố dlopen.

Để khắc phục render trong bản demo của bạn, chỉ cần thêm một Copy Files giai đoạn với mục tiêu khung, thêm mỗi phụ thuộc khuôn khổ cần thiết vào danh sách tập tin, và thiết lập Sản phẩm thư mục như đích. Bây giờ, khi Xcode xây dựng bản demo của bạn để hiển thị, nó cũng sẽ bao gồm các phụ thuộc.


Nếu bạn là người dùng một khung với sự hỗ trợ thể thiết kế:

  • Thêm khuôn khổ (và tất cả phụ thuộc khuôn khổ của nó, nếu có) theo nhị phân nhúng để mục tiêu của bạn
  • Lấy tệp nguồn đồng hành từ gói khung và sao chép nó vào dự án của bạn, thêm nó vào mục tiêu của bạn. Việc thêm tệp nằm trong khung hoặc sử dụng liên kết tượng trưng đáng buồn không hoạt động, vì Xcode dường như không nằm trong các khung công tác ở tất cả các hình
  • Thêm thể hiện của lớp xem có thể thiết kế (MyCustomView trong ví dụ trên) vào bảng phân cảnh. Trình tạo giao diện nên tạo dự án và hiển thị chế độ xem

Vì bạn vẫn phải sao chép thủ công tệp nguồn được cung cấp, có thể thay đổi giữa các phiên bản khung. Tuy nhiên, nó hoạt động khá tốt và cung cấp mọi thứ cần thiết trong chính gói framework.

+0

Điều này thật tuyệt vời. Quá xấu mà Apple tiếp tục bổ sung thêm các tính năng "" mà không có nơi nào gần với một sản phẩm "hoàn thành": (Hy vọng một ngày nào đó họ sẽ đến với một sửa chữa. Tôi thực sự không thể thấy BẤT CỨ giá trị trong việc IBDesignable và IBInspectable chỉ làm việc với các mục tiêu khuôn khổ riêng, giá trị của chúng sẽ đặc biệt bằng cách cho phép các bên thứ ba thu hút sự kiểm soát của họ trong các bảng phân cảnh của dự án của bạn. –

4

Alright, như vậy rõ ràng nếu bạn muốn bao gồm @IBDesignabl e và @IBInspectable trong một framework các framework phải hoặc là:

  • bao gồm trong ứng dụng tiêu thụ, do đó Framework sẽ không được vào dự án riêng của nó. (ví dụ: thêm khung làm mục tiêu bằng cách thực hiện một cái gì đó như 'file -> new.. -> target -> framework' từ ứng dụng tiêu thụ).
  • Bao gồm external framework làm CocoaPod trong đơn đăng ký của bạn. Điều này thực sự thêm framework làm mục tiêu thay vì chỉ liên kết framework với ứng dụng.
    • Có cách để bao gồm địa phương CocoaPods trong một dự án, do đó, đừng lo lắng bạn không phải triển khai framework của bạn cho công chúng chỉ để thực hiện việc này.

EDIT: Tyler Long có một công việc xung quanh với Carthage. Kiểm tra câu trả lời của anh ta.

+0

Thực sự là giải pháp duy nhất? – raulriera

+0

Đó là giải pháp duy nhất tôi tìm được khi làm việc trong khuôn khổ dự án Xcode riêng của mình. Như đã nói ở trên, nếu bạn tạo khung làm khuôn khổ nhúng trong dự án tiêu thụ, mọi thứ sẽ ổn và bạn sẽ không cần tạo khung làm CocoaPod. – Sakiboy

+1

Không, Carthage không hỗ trợ nó. https://github.com/Carthage/Carthage/issues/335 –

6

Tôi có giải pháp thay thế. Với cách giải quyết này, bạn không cần thêm khung làm mục tiêu. Vì vậy, nó hoạt động với Carthage.

@IBDesignable 
class MyCustomView: CustomView { 

    @IBInspectable override var bgColor: NSColor { 
     get { 
      return super.bgColor 
     } 
     set { 
      super.bgColor = newValue 
     } 
    } 
} 

Tạo một lớp phụ (MyCustomView) của lớp tùy chỉnh (CustomView) trong dự án đích (không nằm trong dự án khuôn khổ), và đánh dấu các lớp tiểu như @IBDesignable. Sử dụng lớp con trong ứng dụng của bạn. Bằng cách này làm cho công việc @IBDesignable.

Bên trong lớp phụ, ghi đè các thuộc tính @IBInspectable đó (bgColor), cách này làm cho công việc @IBInspectable.

Bạn có thể gặp phải vấn đề này: Loading code from a framework for a custom control in IBDesignable Tiếp theo hướng dẫn này để giải quyết nó: http://www.dribin.org/dave/blog/archives/2009/11/15/rpath/

Và xin vui lòng làm cho cả hai lớp tùy chỉnh và các thuộc tính của nó inspectable công cộng khác phương pháp này không biên dịch.

Vui lòng để lại nhận xét nếu bạn không thể làm cho nó hoạt động.

3

UICircularProgressRing giải quyết vấn đề này bằng cách thêm tệp Swift có chứa lớp @IBDesignable trong thư mục Headers. Để làm điều này, chọn dự án Xcode của khuôn khổ này, chọn mục tiêu của khung, sau đó đi đến giai đoạn xây dựng tab và mở rộng Headers giai đoạn, và thả các tập tin Swift vào Công:

Screenshot of Xcode Build Phases tab showing Headers phase

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