簡體   English   中英

Swift-初始化UIView的子類

[英]Swift - Initialize a subclass of UIView

我已經有一個安裝視圖,並希望將其包裝在UIView的子類中。

class ElementView: UIView {
    var selected = false
}

問題是我無法使用已經存在的view初始化ElementView Swift也不允許分配給self。

init(view: UIView) {
    //here I would have to call super.init(coder: NSCoder?) or super.init(frame: CGRect)
    //none of which actually properly initializes the object
}

任何想法如何實現這一點? 謝謝 :)


澄清:

我將為您提供更大的背景信息,希望它會更加清晰:

我正在實現UIScrollView子類。 滾動視圖包含一個UIView對象數組,這些對象從外部(從類的用戶)添加到外部。 在我的自定義UIScrollView類中,我想為每個對象實現一個輕擊手勢識別器。 已經完成了:

let singleTap = UITapGestureRecognizer(target: self, action: Selector("handleTap:"))
singleTap.cancelsTouchesInView = false
addGestureRecognizer(singleTap)

和處理程序:

func handleTap(recognizer: UITapGestureRecognizer) {
    //some code to handle the tap
}

當我要處理輕擊,我想存儲視圖的先前狀態(是否被輕擊)以在輕擊發生時切換該狀態時,就會出現問題。 我想根據其狀態對UIView做不同的事情。

ognitor.view返回識別器附加到的視圖,這是我所需要的。 但是,這樣我就不可能為UIView實現狀態。

這就是為什么我想為UIView實現一個自定義包裝,該包裝應該包含狀態信息(這也是一個問題)。 這就是我提出這個問題的方式...

為了為UIView子類創建自定義init,必須為UIView超類調用所需的init。 同樣,在創建自定義init時,您必須將視圖的Frame發送給超類。 滿足這些要求后,您可以將任何參數(包括分接頭識別器信息)傳遞給新創建的init

請記住,如果要創建任何變量-創建實例時它們必須不nil ,因此在變量聲明中,必須創建一些初始參數(例如-0表示Int等),以使初始化程序起作用。 這是示例代碼:

var variableOne: Int = 0
var variableTwo: Int = 0

init(variableOne: Int, variableTwo: Int) {
    self.variableOne = variableOne
    self.variableTwo = variableTwo
    super.init(frame: CGRectZero)
}

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
}

聽起來好像您正在嘗試模仿副本構造函數,聽起來好像您正在嘗試在IB中構建它。 簡短的答案是您所做的沒有意義。 進一步聽起來,您希望上面的代碼擁有或假定參數視圖的身份(您對無法分配給self的引用)。 如果這個假設是正確的,那么您的代碼將毫無意義-您只需要分配給變量即可。

只需使用發布的代碼創建視圖類,就無需實現構造函數,因為已為所選變量提供了默認值。 然后通過基於編碼器的構造函數從IB填充您的遺囑。

如果要克隆或復制給定的視圖,請參閱“可以復制UIView”

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM