【问题标题】:Swift 2.0, UITableView: Fetch index of 'checked' rowsSwift 2.0,UITableView:获取“已检查”行的索引
【发布时间】:2016-01-10 22:20:53
【问题描述】:

我在 UIViewController 中有一个 UITableView。我在这个视图控制器的底部有一个按钮。所有表格单元格都包含一个复选框,它是 UIButton 和 UILabel 的子类。按下按钮时,我想获取所有“已检查”单元格的标签文本。现在我不能使用 cellForRowAtIndexPath 因为它会为不可见的单元格返回一个 nil 值。因此,我想索引我的数据源。但问题是,由于 UIButton 没有 UITextfield 之类的 UIButtonDelegate,我不知道如何捕获按钮单击并存储选中复选框的单元格的 indexPath 行。请帮忙!非常感谢!

这是我的复选框代码,供参考

class CheckBox: UIButton {

/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
override func drawRect(rect: CGRect) {
    // Drawing code
}
*/
// images
var checkedImage = UIImage(named: "check")
var unCheckedImage = UIImage(named: "uncheck")

// bool property
var isChecked: Bool = false {
    didSet {
        if isChecked == true {
            self.setImage(checkedImage, forState: .Normal)
        } else {
            self.setImage(unCheckedImage, forState: .Normal)
        }
    }
}

override func awakeFromNib() {
    self.addTarget(self, action: "buttonClicked:", forControlEvents: UIControlEvents.TouchUpInside)
    self.isChecked = false
}

func buttonClicked(sender: UIButton) {
    if (sender == self) {
        if isChecked == true {
            isChecked = false
        } else {
            isChecked = true
        }
    }
}
}

【问题讨论】:

  • 您是否考虑将这些值保存在一个数组中?这是一个简单的解决方案,但也许值得考虑。
  • 我在一个数组中有我的值,但我需要一个索引来从这个数组中检索值。该索引将是“已检查”行的 indexPath.row。

标签: swift uitableview delegates uibutton swift2


【解决方案1】:

你可以实现一个tableviewcell。你必须在你的单元格中创建所有元素。在那个单元格中你必须维护这个变量 var indexofRow // 在为 UITableView 设置单元格时设置此项。

  override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) - > UITableViewCell {
    let cell: yourFeedCell = tableView.dequeueReusableCellWithIdentifier("yourTableCell") as!yourFeedCell
    cell.indexofRow = indexPath.row;

  }

  /*Code in you cell class*/
  //Maintain one dictonary Globally 
  var listOfCheckedCells = [Int: Bool]()
    // bool property



  var isChecked: Bool = false {
    didSet {
      if isChecked == true {
        self.setImage(checkedImage, forState: .Normal)
        listOfCheckedCells[self.indexofRow] = true
      } else {
        self.setImage(unCheckedImage, forState: .Normal)
        listOfCheckedCells[self.indexofRow] = false
      }
    }
  }

希望这会有所帮助

【讨论】:

    【解决方案2】:

    您已经从UIButton 继承。 AFAICS,您需要一个方法调用才能知道何时按下按钮。 UIControl上有一个方法(也适用于UIButton):

    func sendAction(_ action: Selector,
                 to target: AnyObject?,
           forEvent event: UIEvent?)
    

    UIControl 实现此方法以将操作消息转发到 单例 UIApplication 对象(在其 sendAction:to:fromSender:forEvent: 方法)用于将其分派到 目标,如果没有指定目标,则指向第一个对象 愿意处理它的响应者链。子类可以覆盖 此方法用于观察或修改动作转发行为。这 sendActionsForControlEvents 的实现:可能会调用此方法 重复,每个指定的控制事件一次。

    您可以重写该方法,调用 super 的实现并让您的观察者/代表知道相关的操作即将执行。

    【讨论】:

    • 这种方式远比仅仅在 buttonClicked 中报告按钮的状态更通用:
    • 我不明白这个解决方案。
    【解决方案3】:

    表格视图单元格仅在可见时才会填充,因此如果您想保存单元格的值并在其不可见时保留它,请创建一个字典,其中索引路径为键,单元格的内容为价值。然后在选中和取消选中复选框时更新字典。最后,当单击“视图底部的按钮”时,从字典中获取数据。这是一个示例

    var textOfLabels:[NSIndexPath:String]?
    
    func buttonClicked(sender: UIButton) {
        let view = sender.superview!
        let cell = view.superview as! UITableViewCell //or your custom cell name
        let indexPath = itemTable.indexPathForCell(cell)
        if (sender == self) {
            if isChecked == true {
                isChecked = false
                textOfLabels?.updateValue(theLableText, forKey: indexPath)
            } else {
                isChecked = true
                textOfLabels?.removeValueForKey(indexPath)
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-23
      • 1970-01-01
      相关资源
      最近更新 更多