我在uitableview的一个单元格中有两个图像,这些图像显示来自外部服务器的图像,并且它们的每个标记都有该图像所代表的项目ID,如果我点击此图像,我需要将用户移动到新视图控制器显示此项目的详细信息,我强制出现问题,用户需要双击显示详细信息而不是单击,下面是我的代码:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let cell = self.tableView.cellForRow(at: indexPath as IndexPath) as! prodctCell
Id1stMove = cell.image1st.tag
let tapGesture = UITapGestureRecognizer (target: self, action: #selector(ItemsController.imgTap))
cell.image1st.addGestureRecognizer(tapGesture)
cell.image1st.isUserInteractionEnabled = true
let cell1 = self.tableView.cellForRow(at: indexPath as IndexPath) as! prodctCell
Id2ndMove = cell1.image2nd.tag
let tapGesture1 = UITapGestureRecognizer (target: self, action: #selector(ItemsController.imgTap1))
cell1.image2nd.addGestureRecognizer(tapGesture1)
}
func imgTap()
{
let secondViewController = self.storyboard?.instantiateViewController(withIdentifier: "testViewController") as? testViewController
let navController = UINavigationController(rootViewController: secondViewController!)
navController.setViewControllers([secondViewController!], animated:true)
self.revealViewController().setFront(navController, animated: true)
revealViewController().pushFrontViewController(navController, animated: true)
secondViewController?.movmentId = Id1stMove
updateCount(itemId: Id1stMove)
}
答案 0 :(得分:4)
昨天我自己创建了样本并尝试过。我得到了解决方案。但是当我做一些工作时,我无法立即发布我的答案。
现在我会给你答案。我不希望得到以下答案的声誉。
第一次点击或点按图片时,会导航。
您不需要在didSelectRowAt方法中为imageView添加TapGestureRecognizer。您需要在cellForRowAt方法中为图像视图添加TapGestureRecognizer。
import UIKit
class ViewController: UIViewController,UITableViewDelegate,UITableViewDataSource {
let mobiles: [String] = ["iPhone", "Android"]
let images: [String] = ["iPhone.png", "android.png"]
@IBOutlet var tableViewImageTapping: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
// number of rows in table view
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.mobiles.count
}
// create a cell for each table view row
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
{
var cell:UITableViewCell? = tableView.dequeueReusableCell(withIdentifier: "cell")
if (cell == nil) {
cell = UITableViewCell(style:UITableViewCellStyle.default, reuseIdentifier:"cell")
}
cell?.textLabel?.text = self.mobiles[indexPath.row]
let strImageName = images[indexPath.row]
cell?.imageView?.image = UIImage(named: strImageName)
cell?.imageView?.tag = indexPath.row
let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(imageTapped(tapGestureRecognizer:)))
tapGestureRecognizer.numberOfTapsRequired = 1
cell?.imageView?.isUserInteractionEnabled = true
cell?.imageView?.addGestureRecognizer(tapGestureRecognizer)
return cell!
}
// method to run when table view cell is selected
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
print("You tapped table view cell index is \(indexPath.row).")
}
// method to run when imageview is tapped
func imageTapped(tapGestureRecognizer: UITapGestureRecognizer)
{
let imgView = tapGestureRecognizer.view as! UIImageView
print("your taped image view tag is : \(imgView.tag)")
if (imgView.tag == 0) //Give your image View tag
{
//navigate to next view
}
else{
}
}
}
输出截图
印刷结果
首次点击第一张图片时
然后在第一次单击时单击第二个图像
答案 1 :(得分:2)
您需要在cellForRowAt indexPath中执行此代码,而不是选择。
如你所说,你想使用标签值中的图片ID,我建议在下面更改,除了在cellForRowAt indexPath中添加代码:
更改tapGesture代码如下:
let tapGesture = UITapGestureRecognizer (target: self, action: #selector(imgTap(tapGesture:)))
和imgTap功能:
func imgTap(tapGesture: UITapGestureRecognizer) {
let imgView = tapGesture.view as! UIImageView
let idToMove = imgView.tag
//Do further execution where you need idToMove
}
答案 2 :(得分:0)
as! prodctCell
.tag
单元格通常会重复使用它可能会在某些边缘情况下中断现在回到你的问题,你已经有一个保存图像的自定义单元格。 你有几种可能性
然后为按钮/手势识别器创建一个@IBAction
,以及一个调用主viewController的委托方法,您可以在其中传递所需的所有数据以实例化第二个VC
<强>更新强>
我建议不要在cellForRow
中添加处理tap的逻辑,viewController不是为了处理和管理他的子逻辑。
答案 3 :(得分:0)
您正在“在索引路径中选择行”方法中分配手势识别器,这意味着用户必须选择(点击)一个单元格以将手势识别器分配给图像,然后用户必须点击那些识别器的图像通过调用“imgTap()”作出反应,这是两个水龙头。
您应该做的是在“索引路径中的行的单元格”方法中分配手势识别器,因此当您创建每个单元格时,您还可以创建手势识别器,这样当用户第一次点击图像时识别出水龙头并调用“imgTap()”。
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier", for: indexPath) as! CustomCell
// Configure the cell...
let tapGesture1 = UITapGestureRecognizer (target: self, action: #selector(ItemsController.imgTap))
cell.image1st.addGestureRecognizer(tapGesture1)
let tapGesture2 = UITapGestureRecognizer (target: self, action: #selector(ItemsController.imgTap))
cell.image2nd.addGestureRecognizer(tapGesture2)
return cell
}
我还建议稍微更改一下代码,这样你就可以用一个参数(被点击的内容的id)调用“imgTap()”,而不是使用2个方法“imgTap()”和“imgTap1()”。 / p>