![](/img/trans.png)
[英]Swift 4: programmatically created button addTarget crashes inside delegated class
[英]How invoke a method in the method addTarget of the Button class when I create programmatically the button in a plain class in Swift
我對方法“ addTarget”有疑問。 在我的程序中,我讀取了一個包含圖形界面信息的文件。 根據該文件,我以編程方式創建了圖形元素。
我有任何可能的元素類型的類。 例如,我有Button類和Text類。 當我讀取並解析文件時,將創建適當類的對象。 例如,如果我閱讀標簽“ Button”,則創建一個Button對象,並設置其屬性(寬度,高度,文本,顏色和重力),然后將該對象插入樹中。
// ViewController.swift
import UIKit
class ViewController: UIViewController, UISearchBarDelegate {
private let defaultPage : NSString = "http://xxx/index.xml"
private var dataArray : NSArray = []
internal override func viewDidLoad() {
super.viewDidLoad()
var parser : XMLParser = XMLParser.alloc().initWithURL(NSURL.URLWithString(defaultPage)) as XMLParser
parser.getViews().draw(self)
}
func buttonAction(sender: UIButton!) {
NSLog("Method1")
}
}
// XMLParser
import Foundation
class XMLParser: NSObject, NSXMLParserDelegate {
private var views: Views?
private var view: View?
private var menu: Menu?
private var menuItem: MenuItem?
private var button: Button?
private var parser = NSXMLParser()
private var elements = NSMutableDictionary()
private var element = NSString()
internal func initWithURL(url :NSURL) -> AnyObject {
beginParsing(url)
return self
}
private func beginParsing(xmlUrl :NSURL) {
parser = NSXMLParser(contentsOfURL: xmlUrl)
parser.shouldProcessNamespaces = false
parser.shouldReportNamespacePrefixes = false
parser.shouldResolveExternalEntities = false
parser.delegate = self
parser.parse()
}
internal func getViews() -> View {
return view!
}
internal func parser(parser: NSXMLParser!,didStartElement elementName: String!, namespaceURI: String!, qualifiedName : String!, attributes attributeDict: NSDictionary!) {
element = elementName.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())
switch(element as NSString){
/*...*/
case "button":
button = Button(id:"", link:attributeDict.objectForKey("link") as NSString, width:attributeDict.objectForKey("width") as NSString, gravity:attributeDict.objectForKey("gravity") as NSString, text: "")
view!.appendButton(button!)
break
default:
break
}
}
}
// ButtonClass
class Button{
private var id: String
private var link: String
private var width: String
private var gravity: String
private var text: String
internal init(id: String, link: String, width: String, gravity: String, text: String){
self.id = id
self.link = link
self.width = width
self.gravity = gravity
self.text = text
}
internal func draw(uiViewController: UIViewController, position: Int){
/*Different operations ...*/
var button = UIButton.buttonWithType(UIButtonType.System) as UIButton
button.frame = CGRectMake(x!, 130+50*CGFloat(position), CGFloat(width!), 40)
button.backgroundColor = UIColor.greenColor()
button.setTitle(self.text, forState: UIControlState.Normal)
//button.addTarget(uiViewController, action: "buttonAction:", forControlEvents: UIControlEvents.TouchUpInside)
button.addTarget(self, action: Selector("buttonAction2"), forControlEvents: .TouchUpInside)
uiViewController.view.addSubview(button)
}
func buttonAction2() {
NSLog("h2")
}
}
讀取文件后,按順序打印樹。 為了打印樹,我將對象的方法稱為“繪制”。 方法“ draw”接收UIViewController來打印其不同的元素。 到目前為止,一切正常。
問題是當我單擊按鈕時。 我需要在主體UIViewController中編寫該方法。 我的疑問是,是否有任何方法可以在Button類中編寫此方法然后再調用它。
您可以在Button類初始化程序中添加以下代碼:
button.addTarget(self, action: Selector("yourMethod"), forControlEvents: .TouchUpInside)
yourMethod
必須在Button類中實現
我找到了解決問題的方法。 我做了“ UIButton”類的“按鈕”類的繼承。 這迫使我改寫了“ init”方法和其他方法,但是,為了解決另一個問題,我使用了“ convenience init”。 因此,我可以擁有一個“構造函數”,而不必覆蓋UIButton的主要構造函數。 另一方面,我更改了代碼以在“繪制”方法中創建一個按鈕。 我將新值放在類繼承自父親的屬性中,而不是創建新按鈕。
// ButtonClass
import Foundation
import UIKit
class Button: UIButton{
private var idButton: String = ""
private var link: String = ""
private var width: String = ""
private var gravity: String = ""
private var text: String = ""
convenience init(idButton: String, link: String, width: String, gravity: String, text: String){
self.init()
self.idButton = idButton
self.link = link
self.width = width
self.gravity = gravity
self.text = text
}
internal func draw(uiViewController: UIViewController, position: Int){
/*Different operations ...*/
self.frame = CGRectMake(x!, 130+50*CGFloat(position), CGFloat(width!), 40)
self.backgroundColor = UIColor.greenColor()
self.setTitle(self.text, forState: UIControlState.Normal)
self.addTarget(self, action: "buttonActionTouchUpInside:", forControlEvents: .TouchUpInside)
uiViewController.view.addSubview(self)
}
internal func buttonActionTouchUpInside(sender: UIButton!) {
NSLog("h2: "+self.text)
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.