2015-08-16 1 views
1

У меня есть класс ManageCell, в котором хранятся фреймы, задаются тексты меток и т. Д. Какие подвид UIView CellView, который находится в ViewController.UIButton не доступен для кликов при реализации из класса

ManageCell:

import Foundation 
import UIKit 
class ManageCell { 
    var name: UILabel 
    var viewBelowButton: UIView 
    var deleteButton: UIButton 
    init (name: String) { 
     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(ViewController.self, action: "deleteButtonPressed:", forControlEvents: UIControlEvents.TouchUpInside) 
     self.deleteButton.setTitle("delete", forState: .Normal) 
    } 
} 

ViewController:

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

пользователя Взаимодействие включена на обоих cellView[index], viewBelowButton и deleteButton.

Проблема я столкнулся в том, что deleteButtonне реагирует на прикосновения. Функция deleteButtonPressed: не вызывается.

код: https://github.com/an23lm/swift-stuff

Я не уверен, если это хорошая практика, любые предложения приветствуются.

+0

Похоже, кнопка находится за пределами рамки одного из своих superviews. Попробуйте установить 'clipsToBounds' в' true' для всех задействованных представлений. Если я прав, вы больше не сможете увидеть кнопку (или, по крайней мере, ее часть). –

+0

Почему бы вам не добавить addTarget, когда вы добавляете кнопку в свой класс ViewController? Таким образом, у вас будет селектор в том же классе. Также проверьте рамку, как правильно предложил Аарон. –

+0

@GurtejSingh Хорошая точка. Это еще одна проблема, хотя кнопочный выключатель даже не регистрируется, или OP не потерпит крах. –

ответ

1

Конечно, это не называется, ViewController.self - тип класса, а не ваш контроллер View. И даже если бы это было так, это не очень хорошая практика. Вы должны использовать шаблон делегата здесь с некоторым возвращаемым параметром, чтобы вы могли различить, какая кнопка удаления ячейки была нажата.

Пример на код:

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") 
    } 
} 
+0

Ошибка: '' ManageCell '' не имеет члена с именем 'delegate'' в строке с 'self.delegate? .manageCekkDeletePressed (id)' и 'cell.delegate = self' – an23lm

+0

' ViewController.self' является экземпляр типа 'Class'. Если бы это была единственная проблема, произошел сбой «непризнанного селектора». Первая проблема заключается в том, что действие не запускается вообще. –

+0

@ an23lm Кажется, вы пропустили строку 'weak var' из моего примера – rshev

Смежные вопросы