现在试图解决这个问题一段时间,经过几个小时的寻找解决方案,我决定是时候问了。
我有一个由自定义UITableViewCells填充的tableview,当前当你点击一个单元格时,它会带你进入详细视图。
在自定义单元格中有一个图像,我希望用户能够点击该图像并转到显示图像的popover VC。
我遇到的麻烦是在点击图像时创建segue。
在自定义单元格的文件中,我在图片 (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
}
我也在自定义单元格文件中有一个功能:
func imageTapped(sender: UIGestureRecognizer) {
print("image tapped")
}
在我的视图控制器文件中,我在索引路径的did select行中添加了一个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)
}
另外,在故事板中我创建了一个来自VC的segue,它将自定义单元格的表格视图保存到VC中,我想在点击图像时显示。
我已经尝试了几种不同的方法让它工作并且没有任何运气,上面看到的代码是我经过多次尝试失败后仍然存在的代码。我觉得自定义单元文件中的tap和VC文件中的segue的功能是解决方案的一部分,所以我就把它们留在了。
任何帮助将不胜感激。谢谢!
根据以下答案更新代码:
添加协议
protocol ImageSegueProtocol: class {
func imageTapped(row: Int)
}
class PostCell: UITableViewCell {
添加了IAB Func
@IBAction func imageTapped(sender: UIGestureRecognizer) {
guard let row = row else { return }
delegate?.imageTapped(row)
print("image tapped func")
}
在主VC中声明委托
weak var delegate:postCell?
指定Delgate
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
添加了扩展功能
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")
}
}
答案 0 :(得分:4)
你可以这样做:
在单元格文件中,在顶部声明一个协议,然后在单元格类本身内设置一些属性,并在响应要点击的图像时设置委托行为:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Requests;
class HomeController extends Controller
{
public function index() {
return '<form action="'. route('home') .'" method="post"><input type="text" name="email"><input type="submit"></form>';
}
public function create(Request $request) {
dd($request->email);
}
}
然后你必须让你的ViewController采用SomeCellProtocol并像这样调用segue:
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)
}
}
您必须通过调用:
将ViewController设置为您的单元格的委托extension SomeViewController: SomeCellProtocol {
func imageTapped(row: Int) {
//get object from array and call segue here
}
}
并将行传递给单元格:
someCell.delegate = self
在ViewController的cellForRowAtIndexPath方法中。
因此,当在单元格内点击按钮时(或者你可以在ImageView上使用GestureRecognizer进行操作),它将强制委托(ViewController)调用其imageTapped函数,传递一个你参与的行参数可用于确定表中的哪个对象(其对应的数据数组)应通过Segue传递。
答案 1 :(得分:0)
您需要做的是创建一个按钮而不是图像,此按钮将保存实际图像:
其余的很简单,ctrl将IBAction拖到自定义单元格文件中。 现在,您需要与View Controller进行通信,以便调用您的segue方法。
您可以使用2种设计模式实现这一目标:
在View Controller中添加一个观察者:
NSNotificationCenter.defaultCenter().addObserver(self,
selector: #selector(YourViewController.cellSelected(_:)),
name: "CellSelectedNotificationName",
object: nil)
View Controller中的方法cellSelected
应如下所示:
func cellSelected(notification : NSNotification)
{
if let passedObject = notification.object as? YourCustomObject
{
// Do what ever you need with your passed object
// When you're done, you can invoke performeSegue that will call prepareForSegue
// When invoking performeSegue you can pass your custom object
}
}
在您的CustomCell类中,按钮的IBAction方法:
@IBAction func buttonTapped()
{
// Prepare the object you want to pass...
NSNotificationCenter.defaultCenter().postNotificationName("CellSelectedNotificationName", object: YourCustomObjectYouWantToPass)
}
在坚果壳中,单击了单元格内的按钮,您在该单元格内创建了一个对象,然后使用通知中心将其传递给View Controller。现在,您可以使用自定义对象进行调整。
注意:如果您不需要传递对象,您基本上可以从UIButton(在故事板上)按住Ctrl键并拖动到另一个视图控制器。
答案 2 :(得分:0)
正如OhadM所说,创建一个按钮并将背景图像设置为您想要显示的图像。从那里,你甚至不需要IBAction。 按住 - 从按钮拖动到下一个视图控制器并创建segue 。
然后,如果你想在segue之前做任何设置,在第一个VC你会有类似的东西:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "imageButtonPressed" { // Make sure you name the segue to match
let controller = segue.destinationViewController as! SecondVC
controller.someText = "Hi"
controller.someInt = 5
}
}