2015-05-13 69 views
0

是否可以在上設置UILabel(或圖片如果使用UIImageView)的設計時間文本iOS 8?如果是這樣,如何?iOS在故事板上添加設計時文本

基本上我需要的是在編譯之前不要清空我的所有標籤,以便它在從網絡加載實際數據之前不顯示虛擬數據。以編程方式清除所有網點的算法並不是一個很好的解決方案,因爲它是不必要的代碼。

回答

2

你可以嘗試繼承你想擁有設計時屬性的類。下面是的UILabel的一個例子:

import UIKit 

class UIPrototypeLabel: UILabel { 
    @IBInspectable var isPrototype: Bool = false 

    override func awakeFromNib() { 
    if (isPrototype) { 
     self.text = "test" 
    } 
} 

然後,在IB,你會看到isPrototype,你可以將它設置爲true或false。

如果需要,您還可以在isPrototype中將缺省值從false更改爲true:Bool = false。如果isPrototype爲true,您也可以更改會發生什麼情況。我讓它使文本「測試」,所以我可以看到反饋時,測試了這一點,所以你可以改變它爲零或「」或其他。

你也可以避開isPrototype bool,並讓這個類總是重置文本。我只是認爲IBInspectable屬性很酷,但如果你只是想讓這個類總是清除標籤文本,那麼你只需刪除布爾和檢查,只是每次都刪除self.text = nil。

對這種方法的認識是你需要使你的所有標籤UIPrototypeLabel獲得這個功能。

enter image description here

還有第二個,可怕的辦法,將這一功能添加到您的所有UILabels的,那就是擴展的UILabel。

import ObjectiveC 
import UIKit 
// Declare a global var to produce a unique address as the assoc object handle 
var AssociatedObjectHandle: UInt8 = 0 

extension UILabel { 
    @IBInspectable var isPrototype:Bool { 
     get { 
      var optionalObject:AnyObject? = objc_getAssociatedObject(self, &AssociatedObjectHandle) 

      if let object:AnyObject = optionalObject { 
       return object as! Bool 
      } else { 
       return false // default value when uninitialized 
      } 
     } 
     set { 
      objc_setAssociatedObject(self, &AssociatedObjectHandle, newValue, objc_AssociationPolicy(OBJC_ASSOCIATION_RETAIN_NONATOMIC)) 
     } 
    } 

    public override func awakeFromNib() { 
     if (isPrototype) { 
      self.text = "test" 
     } 
    } 
} 

信貸Is there a way to set associated objects in Swift?一段代碼

+0

我愛你的第一種方法,但我認爲我們可以改進的,想幫助我:d?所以基本上,我們在設計時將原型設置爲ON,並在編譯之前關閉。如果我們找到一種方法,在編譯之前不要在ON/OFF之間切換,並且它保持了設計中的行爲。我發現這個鏈接:http://nshipster.com/ibinspectable-ibdesignable/我嘗試使用@IBDesignable,它與TARGET_INTERFACE_BUILDER宏一起工作;但在IB上更改它的值時會「自動編譯」 –

+0

如果您希望標籤具有原型文本,則可以將原型設置爲ON。如果Prototype = ON,只要標籤從NIB喚醒,文本就會在運行時被覆蓋。例如,如果將self.text =「test」行更改爲self.text =「」,那麼無論在設計時何處設置了文本,在運行時它都會設置爲「」,然後你可以手動設置它。每次重新喚醒時,您都必須手動將其重置 –