将变量从 Gesture Recognizer 函数传递到 IBAction

Passing a variable from Gesture Recognizer function to an IBAction

我有一个简单的应用程序,里面有 CollectionView 和项目。 长按 cell 会出现一个 UIView 弹出窗口,其中包含 TextField 和一个将其保存在与 cell.[=25= 相对应的 array 中的选项]

代码如下(buttonsgestures 已在 viewDidLoad() 方法中正确添加):

class CollectionViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate  {
var longPressedPoint: CGPoint?

public var rowOfLongPressedItem: Int? = nil

func handleLongPress(longPressRecognizer: UILongPressGestureRecognizer)  -> Int      {
    print("LONG PRESS Gesture Recognized")
    notePopup.hidden = false
    longPressedPoint =  longPressRecognizer.locationInView(longPressRecognizer.view)
    var indexPathOfLongPressedCell = self.itemCollectionView.indexPathForItemAtPoint(longPressedPoint!)
    rowOfLongPressedItem = (indexPathOfLongPressedCell?.row)
    print("rowOfLongPressedItem -> .\(rowOfLongPressedItem)")
    return rowOfLongPressedItem!
}

func saveNoteButtonTapped(rowOfLongPressedItem: Int) {
    print("rowOfLongPressedItem when Save button is tapped -> .\(rowOfLongPressedItem)")       

    //Can’t go further down as rowOfLongPressedItem is NOT available from “handleLongPress” function…

    var selectedItem = ItemsList[rowOfLongPressedItem]
    selectedItem.counts += 1
    var latest = selectedItem.counts - 1
    selectedItem.timestamp.append(NSDate())
    selectedItem.note.append(noteTextField.text)
    ItemsList[rowOfLongPressedItem] = selectedItem
    print(".\(selectedItem.title) has been tapped .\(selectedItem.counts)")
    print("The latest tap on .\(selectedItem.title) is at .\(selectedItem.timestamp[latest])")
    print("The note .\(noteTextField.text) has been added")
    notePopup.hidden = true
}
}

尝试通过几种方式解决问题:

有人可以帮帮我吗...

rowOfLongPressedItem 可用于两个函数。您不需要将其作为 saveNoteButtonTapped.

的参数
var rowOfLongPressedItem: Int? = nil

func handleLongPress(longPressRecognizer: UILongPressGestureRecognizer)  -> Int      {
    print("LONG PRESS Gesture Recognized")
    notePopup.hidden = false
    longPressedPoint =  longPressRecognizer.locationInView(longPressRecognizer.view)
    var indexPathOfLongPressedCell = self.itemCollectionView.indexPathForItemAtPoint(longPressedPoint!)
    rowOfLongPressedItem = (indexPathOfLongPressedCell?.row)
    print("rowOfLongPressedItem -> .\(rowOfLongPressedItem)")
    return rowOfLongPressedItem!
}

func saveNoteButtonTapped() {

    guard let row = rowOfLongPressedItem else {
        return // rowOfLongPressedItem was nil
    }

    print("rowOfLongPressedItem when Save button is tapped -> .\(row)")
    var selectedItem = ItemsList[row]

    selectedItem.counts += 1
    var latest = selectedItem.counts - 1
    selectedItem.timestamp.append(NSDate())
    selectedItem.note.append(noteTextField.text)
    ItemsList[row] = selectedItem
    print(".\(selectedItem.title) has been tapped .\(selectedItem.counts)")
    print("The latest tap on .\(selectedItem.title) is at .\(selectedItem.timestamp[latest])")
    print("The note .\(noteTextField.text) has been added")
    notePopup.hidden = true
}

假设你想获取所选单元格的行并将其分配给一个全局变量rowOfLongPressedItem,你不需要让handleLongPress returns一个Int.

注意:这是一个Swift 3代码(概念相同):

public var rowOfLongPressedItem: Int? = nil

override func viewDidLoad() {
    //...

    let longPressRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(ViewController.assignRowOfLongPressedItem))

    itemCollectionView.addGestureRecognizer(longPressRecognizer)

    //...
}

func assignRowOfLongPressedItem(longPressRecognizer: UILongPressGestureRecognizer) {
    let longPressedPoint = longPressRecognizer.location(in: longPressRecognizer.view)
    var indexPathOfLongPressedCell = self.itemCollectionView.indexPathForItem(at: longPressedPoint)
    rowOfLongPressedItem = (indexPathOfLongPressedCell?.row)
    // if you long press the first row -for example-, the output should be: "rowOfLongPressedItem -> .Optional(0)"
    print("rowOfLongPressedItem -> .\(rowOfLongPressedItem)")
}

此外,您不需要让 saveNoteButtonTapped 获取 rowOfLongPressedItem 参数。请注意,rowOfLongPressedItem 是可选的,您应该确保它仍然不是 nil(您可以使用 Early Exit 方法):

func saveNoteButtonTapped(sender: UIButton) {
        guard let selectedCellRow = rowOfLongPressedItem else {
            print("rowOfLongPressedItem is nil!!")
            return
        }

        print("rowOfLongPressedItem when Save button is tapped -> .\(selectedCellRow)")
        var selectedItem = ItemsList[selectedCellRow]

        selectedItem.counts += 1
        var latest = selectedItem.counts - 1
        selectedItem.timestamp.append(NSDate())
        selectedItem.note.append(noteTextField.text)
        ItemsList[row] = selectedItem
        print(".\(selectedItem.title) has been tapped .\(selectedItem.counts)")
        print("The latest tap on .\(selectedItem.title) is at .\(selectedItem.timestamp[latest])")
        print("The note .\(noteTextField.text) has been added")
        notePopup.hidden = true
}