我有一个用Swift编写的应用程序,它有一个带有一堆按钮的集合视图。在页面顶部的导航栏中,我有一个密码文本框(有点像我在教程中看到的搜索框)。
当我切换开关时,我收到与开关相关的项目的回调。我无法弄清楚如何从UICollectionViewCell访问密码文本输入。这是细胞的样子:
import UIKit
class GDCell: UICollectionViewCell {
weak var door: Door!
@IBOutlet weak var doorSwitch: UISwitch!
@IBOutlet weak var label: UILabel!
// ???HOW TO GET UITextField at the top of the page???
@IBAction func switchFlipped(sender: AnyObject) {
print("Switch flipped for \(door.id), locked is \(doorSwitch!.on)!")
var uri: String = "\(door.command_uri)\(doorSwitch!.on)"
print("Request: \(uri)")
print(self.contentView.classForCoder)
}
}
以下是我在视图控制器中设置单元格的方法:
override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCellWithReuseIdentifier("GDCellId", forIndexPath: indexPath) as! GDCell
cell.door = doors![indexPath.item]
cell.label.text = "\(doors![indexPath.item].name)"
cell.doorSwitch.on = doors![indexPath.item].status == "Locked"
return cell
}
答案 0 :(得分:1)
<强> 1。选项:委派
最干净的方法可能是创建一个名为GDCellDelegate
的协议,它提供了一种名为cellSwitchFlipped(sender: GDCell)
的方法。 GDCell
获取名为GDCellDelegate
的{{1}}类型的属性。
然后使viewController符合该协议并在其中实现一些逻辑。
在delegate
中,您将单元格的代理人分配给cellForItemAtIndexPath
。
最后,你可能必须告诉单元格它的索引并使用协议方法传回该索引,以便能够在viewController中做出相应的反应。这会将方法的签名更改为self
。
<强> 2。选项:将自己交给
只需在cellSwitchFlipped(sender: GDCell, index:Int)
中创建一个新属性,其类型与密码字段匹配。然后按照在GDCell
中分配door
属性的方式分配该属性的值。
答案 1 :(得分:0)
找到了一个简单的解决方案。我在视图控制器中添加了对UITextField的引用:
class ViewController: UICollectionViewController {
var doors: [Door]?
@IBOutlet weak var passwordTextField: UITextField!
然后,在ViewController中创建一个单元格时:
//3
override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCellWithReuseIdentifier("GDCellId", forIndexPath: indexPath) as! GDCell
cell.door = doors![indexPath.item]
cell.label.text = "\(doors![indexPath.item].name)"
cell.doorSwitch.on = doors![indexPath.item].status == "Locked"
cell.passwordTextField = self.passwordTextField
return cell
}
最后,引用单元格中的UITextField:
class GDCell: UICollectionViewCell {
weak var door: Door!
@IBOutlet weak var doorSwitch: UISwitch!
@IBOutlet weak var label: UILabel!
weak var passwordTextField: UITextField!
@IBAction func switchFlipped(sender: AnyObject) {
print("Switch flipped for \(door.id), locked is \(doorSwitch!.on)!")
var uri: String = "\(door.command_uri)\(doorSwitch!.on)"
print("Request: \(uri)")
print(self.contentView.classForCoder)
print(self.passwordTextField.text)
}
}
根据需要运作。