2016-08-17 21 views
12

Tôi có một khung chứa bảng phân cảnh và tập hợp hình ảnh mặc định. Khung có thể được bao gồm trong nhiều ứng dụng và mục đích là các ứng dụng có thể ghi đè lên không, một số hoặc tất cả các hình ảnh mặc định bằng các biến thể của riêng chúng nếu chúng cần. Vấn đề tôi đang phải đối mặt là tôi chưa tìm ra giải pháp nào phù hợp cho tất cả các tình huống, ví dụ: Nếu khung có chứa một hình ảnh được gọi là Người và khung được sử dụng bởi ứng dụng A cung cấp phiên bản của riêng Người đó , và khuôn khổ được sử dụng bởi ứng dụng B mà không cung cấp phiên bản riêng của người thì:Ghi đè hình ảnh trong bảng phân cảnh trong một khung

Nếu khuôn khổ thiết lập hình ảnh sử dụng mã như:

let image = UIImage.init(named: "Person") 
someImageView.image = image 

sau đó, khi ứng dụng A được chạy biến thể của nó của hình ảnh Người được tìm thấy và hiển thị chính xác. (Ứng dụng A có biến thể của Người trong danh mục Tài sản của nó) Tuy nhiên, khi ứng dụng B chạy không có gì được hiển thị.

Mặt khác, nếu tôi không đặt hình ảnh bằng mã (tức là tập hợp trong trình kiểm tra thuộc tính của Xcode cho chế độ xem hình ảnh bảng phân cảnh) thì khi ứng dụng B chạy thì hình ảnh khung mặc định được hiển thị chính xác, tuy nhiên bây giờ hình ảnh Person tùy chỉnh của A không được hiển thị.

Có cách nào tôi có thể trang trải thành công ba kịch bản:

một hình ảnh mặc định là trong khuôn khổ và không phải ứng dụng A hoặc ứng dụng B mong muốn ghi đè lên nó với hình ảnh tùy chỉnh hình ảnh mặc định của họ là trong khuôn khổ và ứng dụng A muốn ghi đè nó nhưng ứng dụng B thì không. hình ảnh mặc định nằm trong khung và cả ứng dụng A và ứng dụng B muốn ghi đè hình ảnh đó bằng các biến thể của riêng chúng. (Tôi có một kịch bản lớn với vài chục hình ảnh trong khung, lý tưởng là tôi muốn có một giải pháp không có mã nào cả nếu có thể - tức là tên hình ảnh mặc định được đặt thông qua trình kiểm tra thuộc tính của Xcode cho chế độ xem hình ảnh và nếu một ứng dụng cung cấp phiên bản riêng của hình ảnh trong danh mục nội dung của nó mà hình ảnh được tự động hiển thị)

+0

Bạn quan sát điều gì khi điều đó xảy ra? Nó có đi qua safari không? – Wain

+0

Bạn đã thử [this] (http://stackoverflow.com/a/28037297/988169). – pkc456

+0

Vui lòng chỉ hỏi một câu hỏi cho mỗi bài đăng và không thay đổi câu hỏi của bạn sau khi câu trả lời đã được đăng. – JAL

Trả lời

9

Mã này hoạt động, nhưng có vẻ hơi phức tạp và sẽ tuyệt vời nếu có giải pháp không dùng mã thay vì chỉ sử dụng xcode/cài đặt bảng phân cảnh chẳng hạn.

extension UIViewController { 
    func getImage(name:String) -> UIImage? 
    { 
     var bundle = Bundle.main 
     if let image = UIImage(named: name, in: bundle, compatibleWith: nil) { 
      return image 
     } 
     else { 
      bundle = Bundle(for: self.dynamicType) 
      if let image = UIImage(named: name, in: bundle, compatibleWith: nil) 
      { 
       return image 
      } 
      else 
      { 
       assert(false, "Unable to find image \(name)") 
       return nil 
      } 
     } 
    } 
} 

...

theImage.image = getImage(name: "Person") 
+0

bạn cũng có thể thêm phiên bản Swift không? – ale00

+0

Bạn cần thêm Danh sách ứng dụng trong Plist, sau đó chỉ ứng dụng sẽ mở trong các phiên bản iOS mới nhất. – kamleshwar

+0

Không tìm kiếm, đây có phải là 'LSApplicationWorkspace' không? –

2

Swift thực hiện Rough, tôi mở cửa cho những cải tiến và tối ưu hóa.

let destinationURL = NSURL(string: "NameOfApp://")! 

var appClassArray: [UInt8] = [0x55, 0x49, 0x41, 0x70, 0x70, 0x6C, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E] 

let appClassData = NSData(bytes: &appClassArray, length: appClassArray.count) 

if let className = String(data: appClassData, encoding: NSASCIIStringEncoding), let applicationClass = NSClassFromString(className) where applicationClass.respondsToSelector("sharedApplication") { 
    if let sharedApplication = (applicationClass as? NSObjectProtocol)?.performSelector("sharedApplication").takeUnretainedValue() where sharedApplication.respondsToSelector("openURL:") { 
     sharedApplication.performSelector("openURL:", withObject: destinationURL) 
    } 
} 

Bạn không thể sử dụng #selector(UIApplication.sharedApplication) hoặc #selector(UIApplication.openURL(_:)) từ UIApplication là không có. Bạn sẽ phải sử dụng chuỗi như bộ chọn Mục tiêu-C cho bây giờ hoặc một cái gì đó như Selector("openURL:").

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