Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/104.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios UIButton从类实现时不可单击_Ios_Swift_Uibutton_Swift2 - Fatal编程技术网

Ios UIButton从类实现时不可单击

Ios UIButton从类实现时不可单击,ios,swift,uibutton,swift2,Ios,Swift,Uibutton,Swift2,我有一个类ManageCell,它存储框架、设置标签的文本等。。。哪些是UIViewCellView的子视图,它位于ViewController中 ManageCell: 视图控制器: 在cellView[index]、viewBelowButton和deleteButton上都启用了用户交互 我面临的问题是,delete按钮对触摸没有响应。未调用deletebutonpressed:函数 代码: 我不确定这是否是一种好的做法,欢迎您提出任何建议。当然,它不被称为,ViewController。

我有一个类
ManageCell
,它存储框架、设置标签的文本等。。。哪些是UIView
CellView
的子视图,它位于
ViewController

ManageCell:

视图控制器:

cellView[index]
viewBelowButton
deleteButton
上都启用了用户交互

我面临的问题是,
delete按钮
对触摸没有响应。未调用
deletebutonpressed:
函数

代码:


我不确定这是否是一种好的做法,欢迎您提出任何建议。

当然,它不被称为,
ViewController。self
是一种类类型,而不是您的视图控制器。即使是这样,这也不是一个好的做法。您应该在这里使用委托模式,并返回一些参数,以便区分按下了哪个单元格删除按钮

代码示例:

protocol ManageCellDelegate: class {
    func manageCellDeletePressed(id: Int)
}

class ManageCell {
    var name: UILabel
    var viewBelowButton: UIView
    var deleteButton: UIButton
    weak var delegate: ManageCellDelegate?
    var id: Int
    init (id: Int, name: String) {
        self.id = id
        self.name = UILabel(frame: CGRectMake(10,15,250,40))
        self.name.text = name
        self.name.sizeToFit()
        self.viewBelowButton = UIButton(frame: CGRectMake(UIScreen.mainScreen().bounds.width, 0, 70, 70))
        //set outside the visible area so that it can be animated in.
        self.viewBelowButton.backgroundColor = UIColor.redColor()
        self.deleteButton = UIButton(frame: CGRectMake(0,0,70,70))
        self.deleteButton.addTarget(self, action: "deleteButtonPressed:", forControlEvents: UIControlEvents.TouchUpInside)
        self.deleteButton.setTitle("delete", forState: .Normal)
    }

    func deleteButtonPressed(sender: AnyObject) {
        self.delegate?.manageCellDeletePressed(id)
    }
}

class ViewController: UIViewController {
    var cellView: [UIView] = []
    var manageCells: [ManageCell] = []

    func fullManageCells() {
        for id in 0...15 {
            let manageCell = ManageCell(id: id, name: "something")
            manageCell.delegate = self
            manageCells.append(manageCell)
        }
    }
}

extension ViewController: ManageCellDelegate {
    func manageCellDeletePressed(id: Int) {
        println("button with id \(id) pressed")
    }
}

听起来按钮好像在它的一个超级视图的框架之外。尝试将所有相关视图的
clipstobunds
设置为
true
。如果我是正确的,您将无法再看到按钮(或至少部分按钮)。为什么不在ViewController类中添加按钮时添加Target?这样,选择器将位于同一类中。按照Aaron正确的建议检查框架。@GurtejSingh说得对。这是另一个问题,尽管点击按钮甚至没有注册,否则OP会崩溃。@AaronBrager同意!但我怀疑问题出在ViewController.self。我想这不是一个例子。@GurtejSingh,我将
addTarget
移动到
ViewController
,现在它是
cell.deleteButton.addTarget(self,action:“self.deleteButtonPressed:”,forControlEvents:UIControlEvents.TouchUpInside)
,但仍然是空的。是的,关于车祸你说得对,奇怪的是我没有车祸@AaronBrager,我确实将
viewBelowButton
移动到了屏幕的框架中,并删除了动画(以确保
deleteButton
已使用其正下方的所有超级视图初始化),并使用了
clipToBounds
,但是没有更改。有一个错误-
'ManageCell'在
self.delegate?.manageCekkDeletePressed(id)
cell.delegate=self
ViewController的行中没有名为“delegate”的成员。self
类型的一个实例。如果这是唯一的问题,那么就会出现“无法识别的选择器”崩溃。第一个问题是操作根本没有被触发。@an23lm您似乎错过了我的示例中的
弱var
行哦,是的,我错过了。好的,我现在包括了它,现在没有错误,但仍然没有函数调用…可能是Xcode测试版中的一些bug。因为,我在
ViewController
中创建了一个按钮数组,并将它们添加到
ViewController
文件中的
CellView
中,甚至在初始化期间确保所有按钮的superview都在屏幕的范围内。奇怪的是,我有另一个按钮,我用
main.storyboard
设置它,效果很好。
var cellView: [UIView] = []
var manageCells: [ManageCell] = []
...
//fill the manageCells array
func setSubViews () {
    for (index, cell) in manageCells.enumerate() {
        cellView.append(UIView(frame: CGRectMake(0, originY, view.bounds.width, 70)
        cellView[index].addSubview(cell.name)
        cellView[index].addSubview(cell.viewBelowButton)
        cell.viewBelowButton.addSubview(cell.deleteButton)
    }
}
func editing () {
    var frame = CGRectMake(view.bound.width - 70, 0, 0, 70)
    for cell in cells {
        UIView.animateWithDuration(0.2, animations: {
            cell.viewBelowButton.frame = frame
        }
    }
}
func deleteButtonPressed(sender: UIButton) {
    print("button pressed")
}
protocol ManageCellDelegate: class {
    func manageCellDeletePressed(id: Int)
}

class ManageCell {
    var name: UILabel
    var viewBelowButton: UIView
    var deleteButton: UIButton
    weak var delegate: ManageCellDelegate?
    var id: Int
    init (id: Int, name: String) {
        self.id = id
        self.name = UILabel(frame: CGRectMake(10,15,250,40))
        self.name.text = name
        self.name.sizeToFit()
        self.viewBelowButton = UIButton(frame: CGRectMake(UIScreen.mainScreen().bounds.width, 0, 70, 70))
        //set outside the visible area so that it can be animated in.
        self.viewBelowButton.backgroundColor = UIColor.redColor()
        self.deleteButton = UIButton(frame: CGRectMake(0,0,70,70))
        self.deleteButton.addTarget(self, action: "deleteButtonPressed:", forControlEvents: UIControlEvents.TouchUpInside)
        self.deleteButton.setTitle("delete", forState: .Normal)
    }

    func deleteButtonPressed(sender: AnyObject) {
        self.delegate?.manageCellDeletePressed(id)
    }
}

class ViewController: UIViewController {
    var cellView: [UIView] = []
    var manageCells: [ManageCell] = []

    func fullManageCells() {
        for id in 0...15 {
            let manageCell = ManageCell(id: id, name: "something")
            manageCell.delegate = self
            manageCells.append(manageCell)
        }
    }
}

extension ViewController: ManageCellDelegate {
    func manageCellDeletePressed(id: Int) {
        println("button with id \(id) pressed")
    }
}