我使用UIAlertController詢問用戶輸入字符串,並且此字符串不應該爲空。爲此,我爲位於UIAlertController上的UITextField上的每個編輯事件添加處理程序。該處理程序檢查textField是否爲空,它會禁用「OK」按鈕(位於UIAlertController上),如果textField不爲空,它將使「OK」按鈕啓用。 «確定»按鈕也位於UIAlertController上。 我有一個問題,從這個 處理函數訪問«OK»按鈕:如何從放置在UIAlertController上的UITextField的處理程序訪問放置在UIAlertController上的按鈕?
- 沒有機會直接通過按鈕作爲參數傳遞給處理函數,因爲我使用#selector叫它。
- 我也嘗試通過處理函數的UITextField.superview來訪問UIAlertController,但它不起作用:它返回的UIView不能被降級到UIAlertController。目前尚不清楚它爲什麼如此:UITextField是UIAlertController的子視圖,因此UITextField.superview必須返回UIAlertController。
- 我也嘗試了最簡單的方法:在我的ViewController類中聲明UIAlertController屬性:這允許我從處理函數訪問按鈕而不直接將其傳遞給函數。但是在這種情況下,我遇到了另一個問題:在運行時Xcode在調試區域顯示此警告:嘗試在釋放視圖控制器時加載視圖控制器的視圖是不允許的,並且可能導致未定義行爲()
而我的問題是如何從我的處理函數訪問«確定»按鈕?
class TVC_ProgramsList: UITableViewController {
var enterNameAC = UIAlertController()
@IBAction func addpush(sender: UIBarButtonItem) {
addProgram()
}
func addProgram() {
enterNameAC = UIAlertController(title: "Adding program", message: "Enter program name", preferredStyle: UIAlertControllerStyle.Alert)
enterNameAC.addAction(UIAlertAction(title: "Cancel", style: UIAlertActionStyle.Cancel, handler: nil))
enterNameAC.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: nil))
enterNameAC.addTextFieldWithConfigurationHandler { (textField) -> Void in
textField.placeholder = "Program name"
textField.addTarget(self, action: #selector(TVC_ProgramsList.enterProgramNameAC_editingTextField), forControlEvents: UIControlEvents.AllEditingEvents)
}
self.presentViewController(enterNameAC, animated: true, completion: nil)
}
func enterProgramNameAC_editingTextField() {
let programNameString = enterNameAC.textFields![0].text!
if programNameString.characters.count > 0 {
enterNameAC.actions[1].enabled = true
} else {
enterNameAC.actions[1].enabled = false
}
}
}
我是Swift和Xcode的新手,在問我的問題之前,我認爲這是粗略的方式來聲明類爲attrubute UIAlertController或其子視圖,我認爲這種方式不符合Apple的建議或像這樣的東西:)但現在,當你說這是正確的方式,我對此冷靜。 –
在班級中擁有多個屬性是很正常的。只要一個對象被多個函數需要,就應該開始考慮創建屬性,而不是一直傳遞對象作爲參數。 – ezcoding