rya*_*lak 3 uitableview ios segue swift xcode7
经过一段时间的努力,在寻找解决方案几个小时之后,我认为是时候问了。
我有一个由自定义UITableViewCells填充的表格视图,当前当您点击一个单元格时,它将带您到详细视图。
在自定义单元中有一个图像,我希望用户能够点击该图像并选择显示该图像的弹出式VC。
我遇到的麻烦是在点击图像时创建序列。
在自定义单元格的文件中,我在图像(pTap)上设置了轻击手势识别器:
override func awakeFromNib() {
super.awakeFromNib()
let tap = UITapGestureRecognizer(target: self, action: #selector(PostCell.voteTapped(_:)))
let ptap = UITapGestureRecognizer(target: self, action: #selector(PostCell.imageTapped(_:)))
tap.numberOfTapsRequired = 1
ptap.numberOfTapsRequired = 1
voteImage.addGestureRecognizer(tap)
voteImage.userInteractionEnabled = true
featuredImg.addGestureRecognizer(ptap)
featuredImg.userInteractionEnabled = true
}
Run Code Online (Sandbox Code Playgroud)
我还在自定义单元文件中有一个用于点击的功能:
func imageTapped(sender: UIGestureRecognizer) {
print("image tapped")
}
Run Code Online (Sandbox Code Playgroud)
在我的视图控制器文件中,我在索引路径的选择行中添加了segue:
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
let post: Post!
if inSearchMode {
post = filteredVenues[indexPath.row]
} else {
post = posts[indexPath.row]
}
print(post?.venueName)
performSegueWithIdentifier("imageTapped", sender: nil)
performSegueWithIdentifier("DetailsVC", sender: post)
}
Run Code Online (Sandbox Code Playgroud)
此外,在情节提要中,我从VC创建了一个segue,将带有自定义单元格的表格视图保存到我想在点击图像时显示的VC。
我尝试了几种不同的方法来使它正常工作,但没有任何运气,您在上面看到的代码是经过多次失败尝试后剩下的代码。我觉得自定义单元文件中的敲击功能和VC文件中的segue功能是解决方案的一部分,所以这就是为什么我将它们保留在其中的原因。
任何帮助,将不胜感激。谢谢!
来自以下答案的代码更新:
新增协议
protocol ImageSegueProtocol: class {
func imageTapped(row: Int)
}
class PostCell: UITableViewCell {
Run Code Online (Sandbox Code Playgroud)
添加了IAB功能
@IBAction func imageTapped(sender: UIGestureRecognizer) {
guard let row = row else { return }
delegate?.imageTapped(row)
print("image tapped func")
}
Run Code Online (Sandbox Code Playgroud)
在主VC中声明为委托人
weak var delegate:postCell?
Run Code Online (Sandbox Code Playgroud)
分配的代尔盖特
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
//let post = posts[indexPath.row]
if let cell = tableView.dequeueReusableCellWithIdentifier("PostCell") as? PostCell {
var img: UIImage?
var vImg: UIImage?
postCell?.delegate = self
Run Code Online (Sandbox Code Playgroud)
增加了扩展功能
extension FeedVC: ImageSegueProtocol {
func imageTapped(row: Int) {
if inSearchMode == true {
let object = filteredVenues[row]
performSegueWithIdentifier("imageTapped", sender: object)
print("ext func")
} else {
let object = posts[row]
performSegueWithIdentifier("imageTapped", sender: object)
print("ext func")
}
}
Run Code Online (Sandbox Code Playgroud)
您可以这样做:
在单元文件中,在顶部声明一个协议,然后在单元类本身内设置一些属性,并响应所点击的图像设置委托行为:
protocol SomeCellProtocol: class {
func imageTapped(row: Int)
}
class SomeCell: UITableViewCell {
weak var delegate: SomeCellProtocol?
var row: Int?
@IBAction func imageTapped() {
guard let row = row else { return }
delegate?.imageTapped(row)
}
}
Run Code Online (Sandbox Code Playgroud)
然后,您必须使ViewController采用SomeCellProtocol并像这样调用内部的segue:
extension SomeViewController: SomeCellProtocol {
func imageTapped(row: Int) {
//get object from array and call segue here
}
}
Run Code Online (Sandbox Code Playgroud)
并且必须通过调用以下命令将ViewController设置为单元的委托:
someCell.delegate = self
Run Code Online (Sandbox Code Playgroud)
并将该行传递到单元格:
someCell.row = indexPath.row
Run Code Online (Sandbox Code Playgroud)
在ViewController的cellForRowAtIndexPath方法中。
因此,当在单元格中点击按钮时(或者您可以在ImageView上使用GestureRecognizer进行操作),它将强制委托(ViewController)调用其imageTapped函数,并传递一个行参数,您可以将其用于确定应通过Segue传递表中的哪个对象(其对应的数据数组)。
| 归档时间: |
|
| 查看次数: |
1428 次 |
| 最近记录: |