当我在Swift中以普通类创build编程button时,如何调用Button类的方法addTarget中的方法

我有一个方法“addTarget”的问题。 在我的程序中,我读取了一个包含graphics界面信息的文件。 根据这个文件,我编程创buildgraphics元素。

我有一个类的任何可能types的元素。 例如,我有Button类和一个Text类。 当我读取和parsing文件时,我创build了适当类的对象。 例如,如果我读取标签“Button”,我创build一个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来打印其不同的元素。 到目前为止,一切正常。

问题是当我点击button。 我需要在主体UIViewController中编写方法。 我的疑问是,如果有任何方法在我的Button类中编写此方法,然后调用它。

您可以将下面的代码添加到您的Button类初始值设定项中:

  button.addTarget(self, action: Selector("yourMethod"), forControlEvents: .TouchUpInside) 

yourMethod必须在你的Button类中实现

我find了一个解决scheme来解决我的问题。 我做了“button”类inheritance的“UIButton”类。 这迫使我重写“init”方法和其他的,但是,为了解决这个问题,我使用了一个“方便初始化”。 因此,我可以有一个“构造函数”,而不必重写UIButton的主要构造函数。 另一方面,我改变了代码在“绘制”方法中创build一个button。 我把新的值,我的类inheritance的父亲的属性,而不是创build一个新的button。

 // 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) } }