Xcode 6 / Beta 4: không sử dụng các tiêu đề bắc cầu với các mục tiêu khung


131

Tôi vừa nâng cấp lên Xcode 6 Beta 4 và có một khung mà tôi đã tạo cho Chế độ xem trực tiếp trong bản Beta 2. Do một lỗi nhanh khác , tôi cần sử dụng một số mã Obj-C. Khi nâng cấp, tôi gặp lỗi sau:

lỗi: sử dụng các tiêu đề bắc cầu với các mục tiêu khung không được hỗ trợ

Tôi chưa thấy bất cứ điều gì trong ghi chú phát hành, hoặc tìm thấy bất kỳ đường dẫn di chuyển nào khác. Có ai khác nhìn thấy điều này và đi đến một giải pháp?

Tôi nhận ra rằng Beta 3 đã loại bỏ sự cần thiết của các khung cho chế độ xem trực tiếp, nhưng trong trường hợp của tôi, nếu tôi có thể làm cho nó hoạt động có ý nghĩa. Tôi có thể loại bỏ nó mặc dù là một dự phòng, nhưng muốn sử dụng một khung công tác nếu chúng không hoàn toàn bị phá vỡ trong Beta 4.


"Tôi nhận ra rằng Beta 3 đã loại bỏ sự cần thiết của các khung công tác". Làm sao?
hnh

2
(để xem trực tiếp) - đã được chỉnh sửa
Chris Conover

1
Tôi đang gặp vấn đề tương tự.
Simon Germain

2
Ồ, chỉnh sửa nhỏ của bạn ở đó đã làm cho cuộc sống của tôi trở nên tốt hơn rất nhiều - không nghe thấy sự thay đổi này (loại bỏ nhu cầu về khung) ở bất cứ đâu và đập vào đầu tôi với tất cả các mục tiêu khung này để xem trực tiếp trong nhiều giờ. Cảm ơn bạn rất nhiều vì điều này @chrisco!
yonix

Câu trả lời:


232

Như các trạng thái lỗi, tiêu đề bắc cầu không được phép trong Khung. Các Nhập khẩu Mã từ bên trong khung Target Cùng phần của Mix & Match gợi ý tài liệu hướng dẫn táo lúc này. Như họ nói, bạn cần "Trong tệp tiêu đề ô của bạn, nhập mọi tiêu đề Objective-C mà bạn muốn hiển thị cho Swift".

Tuy nhiên, tôi phát hiện ra rằng bạn cũng có thể cần phải công khai những tiêu đề cụ thể đó. Câu trả lời này xem xét lý do và cách thực hiện: Lỗi trình biên dịch Swift: "tiêu đề không theo mô-đun bên trong mô-đun khung" .

Vì vậy, làm điều này:

  1. Xóa tệp tiêu đề bắc cầu của bạn.
  2. Xóa tham chiếu đến tệp tiêu đề bắc cầu trong cài đặt bản dựng cho khung
  3. Thêm các tiêu đề cần thiết vào tệp ô của bạn ([ProductName] .h)
  4. Đặt các tệp được bao gồm công khai trong phần "Tiêu đề" của khung trong "Giai đoạn xây dựng" của khung.
  5. Làm sạch và xây dựng lại.

Lưu ý : "Tệp tiêu đề ô" là một tệp (có tên [ProductName] .h) thường đại diện cho tất cả các tiêu đề công khai của khung. Nó thường chỉ là một danh sách các câu lệnh #import cho các tiêu đề khác có trong khung. Trong Xcode, nếu bạn mở UIKit.h, bạn sẽ thấy một ví dụ hay về tệp ô.


3
Cảm ơn câu trả lời ngắn gọn (đánh dấu như vậy). Tôi đã đọc phần đó nhưng bối rối về sự khác biệt giữa tiêu đề Ô và Cầu.
Chris Conover

1
@ zaxy78 xem phần "Nhập Swift vào Objective-C" của tài liệu này: developer.apple.com/library/ios/documentation/Swift/Conceptual/...
DeepFriedTwinkie

4
@DeepFriedTwinkie, bạn đang đề cập đến tệp ô nào khi bạn nói: "Thêm các tiêu đề cần thiết vào tệp ô của bạn"? Cảm ơn.
Allan Macatingrao

2
Đây chính xác là những gì tôi cần. Thêm chúng vào phần công cộng là sửa chữa.
olivaresF

20
Tôi có đúng không khi cho rằng bất kỳ lớp nào tôi muốn giữ riêng tư trong khung của mình phải được sử dụng bởi một lớp nhanh chóng phải được công khai cho bất kỳ ai sử dụng khung của tôi? Có vẻ như không phải là một giải pháp lý tưởng.
ospr

28

Có hai khả năng. Thêm các tiêu đề cần thiết vào tệp tiêu đề ô và đặt chúng ở chế độ công khai là một cách. Tuy nhiên, đây là một vấn đề nếu các tiêu đề nên có sẵn cho Swift, nhưng không công khai.

Khả năng thứ hai sẽ làm cho các tiêu đề nội bộ có sẵn cho Swift được mô tả chi tiết tại đây . Về cơ bản, một bản đồ mô-đun tương tự như các nhu cầu sau đây cần được tạo:

module AwesomeKitPrivate {  
  header "../InternalClass.h"
  export *
}

Điều này sau đó có thể được bao gồm trong XCode bằng cách sử dụng cài đặt:

SWIFT_INCLUDE_PATHS = $(SRCROOT)/AwesomeKit/ProjectModule  

2
Thông minh! Cảm ơn. Nhiều kỹ thuật ưa thích hơn làm cho tất cả các tiêu đề công khai.
David H

Rất khuyến cáo giải pháp đó chống lại những người khác và xem liên kết được cung cấp cho giải pháp chi tiết
Tancrede Chazallet

Đây là câu trả lời đúng nhưng tùy thuộc vào những gì bạn đang cố gắng đạt được, bạn có thể thoát khỏi việc sử dụng một số macro do Apple cung cấp, giúp ích rất nhiều cho Swift-Objc interop: developer.apple.com/documentation/swift/ Tập
Joe Susnick

Các headertuyên bố chấp nhận một đường dẫn tương đối. Bạn làm gì khi bạn muốn thêm các tiêu đề của một khung công tác khác?
Georgios

13

Xem Nhập Mục tiêu-C vào Swift .

Để nhập mã Objective-C vào Swift từ cùng một khung

  1. Trong Cài đặt bản dựng, trong Đóng gói, đảm bảo cài đặt Mô-đun xác định cho mục tiêu khung đó được đặt thành Có Có ".
  2. Trong tệp tiêu đề ô của bạn, nhập mọi tiêu đề Objective-C mà bạn muốn hiển thị cho Swift. Ví dụ:

        #import "XYZ / XYZCustomCell.h"
        #import "XYZ / XYZCustomView.h"
        #import "XYZ / XYZCustomViewControll.h"
    
  3. Đặt các tệp được bao gồm công khai trong phần "Tiêu đề" của khung trong "Giai đoạn xây dựng" của khung.

  4. Làm sạch và xây dựng lại.

Swift sẽ thấy mọi tiêu đề bạn trưng bày công khai trong tiêu đề ô của bạn. Nội dung của các tệp Objective-C trong khung đó sẽ có sẵn trong bất kỳ tệp Swift nào trong mục tiêu khung đó mà không có bất kỳ câu lệnh nhập nào. Sử dụng mã Objective-C tùy chỉnh của bạn với cùng cú pháp Swift bạn sử dụng với các lớp hệ thống.

let myOtherCell = XYZCustomCell()
myOtherCell.subtitle = "Another custom cell"

Quan trọng: "tệp tiêu đề ô" có nghĩa là tệp {ModuleName} .h. BTW, tên mục tiêu là {ModuleName} .framework.


1
Tôi muốn sử dụng các tệp objc bên trong các mô-đun Tệp của mình nhưng tôi không muốn hiển thị chúng cho các mô-đun khác. Làm thế nào tôi có thể làm như vậy?
Sazzad Hissain Khan

0

Trong trường hợp của tôi, chỉ cần loại bỏ Objective-C Bridging Headercài đặt từ khung của tôi Build Settingsđã giúp.

nhập mô tả hình ảnh ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.