【问题标题】:UICollection View with text box at the top顶部带有文本框的 UICollectionView
【发布时间】:2015-12-23 18:32:55
【问题描述】:

我有一个用 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
}

【问题讨论】:

    标签: ios swift uicollectionview


    【解决方案1】:

    1.选项:委托

    最简洁的方法可能是创建一个名为GDCellDelegate 的协议,它提供了一种名为cellSwitchFlipped(sender: GDCell) 的方法。 GDCell 获得一个类型为 GDCellDelegate 的属性,称为 delegate

    然后您让您的 viewController 符合该协议并在其中实现一些逻辑。

    在您的cellForItemAtIndexPath 中,您将单元格的委托分配给self

    最后,您可能必须告诉单元格它的索引并使用协议方法将该索引传回,以便能够在 viewController 中做出相应的反应。这会将方法的签名更改为cellSwitchFlipped(sender: GDCell, index:Int)

    2。选项:交出自己

    只需在GDCell 中创建一个新属性,其类型与密码字段之一匹配。然后以与在 cellForItemAtIndexPath 中分配 door 属性相同的方式分配该属性的值。

    【讨论】:

    • 我正在尝试理解选项 1。对于选项 2,如果在呈现单元格后密码更改,这将如何工作?我试图避免在每个重复元素上存储密码字段,因为每次更改时我都必须遍历它们并更新它。
    • @mikeb 您不必这样做,单元格知道该字段,而不是文本,因此它们始终可以从中获取当前文本。还是标签必须对密码字段的更改做出反应?在这种情况下,您不应该只循环自己,而只需调用reloadData
    • 对,我第一次没有得到你的答案。那行得通。
    • @mikeb 好吧,那你选择了选项 2!?
    【解决方案2】:

    找到了一个简单的解决方法。我向 View 控制器添加了对 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)  
        }
    
    }
    

    按需工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-07
      • 1970-01-01
      • 1970-01-01
      • 2020-10-13
      • 2022-01-15
      • 2020-09-10
      相关资源
      最近更新 更多