UICollection视图顶部带有文本框

时间:2015-12-23 09:43:25

标签: ios swift uicollectionview

我有一个用Swift编写的应用程序,它有一个带有一堆按钮的集合视图。在页面顶部的导航栏中,我有一个密码文本框(有点像我在教程中看到的搜索框)。

enter image description here

当我切换开关时,我收到与开关相关的项目的回调。我无法弄清楚如何从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
}

2 个答案:

答案 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)  
    }

}

根据需要运作。