如何识别标签点击自定义UITableViewCell - Swift 3

时间:2017-01-07 14:25:33

标签: ios swift uitableview label tableviewcell

我有一个自定义UITableViewCell,我有一个Label,需要根据特定条件进行点击。所以我在其上添加了TapGestureRecognizer。我已经使用了协议和代理。我希望在点击此UILabel时传递参数并执行segue。我能够执行此segue但无法检测到哪个单元格的标签。

我是新手,已经被困了几个小时。任何帮助,将不胜感激。还请告诉我是否有另一种更简单的方法来获得相同的结果。

如果它是一个按钮我可以添加一个目标,但我现在真的被卡住了。

3 个答案:

答案 0 :(得分:4)

正如@KrishnaCA在回答中所说,如果你想让整个标签可点击,那么使用按钮可能会更好。如果您需要它看起来与按钮不同,您还可以在标签上放置一个透明按钮(没有图像的自定义样式)。

无论您使用按钮还是标签+点按手势识别器,您仍需要确定用户点击的indexPath。你可以像Hamid建议的那样在按钮/标签上加一个标签,但这很脆弱。我更喜欢不同的方式。我已经为UITableView编写了一个扩展,可以让你找出哪个单元拥有给定的视图:

using DotNetBrowser;
using DotNetBrowser.Events;
using System;
using System.Threading;

namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var browser = BrowserFactory.Create())
            {
                ManualResetEvent waitEvent = new ManualResetEvent(false);
                browser.FinishLoadingFrameEvent += delegate(object sender, FinishLoadingEventArgs e)
                {
                    // Wait until main document of the web page is loaded completely.
                    if (e.IsMainFrame)
                    {
                        waitEvent.Set();
                    }
                };
                browser.LoadURL("https://www.teamdev.com/dotnetbrowser");
                waitEvent.WaitOne();
                PrintPDF(browser, System.IO.Path.GetFullPath(@"test.pdf"));
            }
        }



        public static void PrintPDF(Browser browser, string sFileName) {
            ManualResetEvent waitEvent = new ManualResetEvent(false);

            var handler = new MyPDFPrintHandler((printJob) => {
                var printSettings = printJob.PrintSettings;
                printSettings.PrintToPDF = true; 
                printSettings.PDFFilePath = sFileName;
                printJob.PrintJobEvent += (s, e) =>
                {
                    System.Diagnostics.Debug.WriteLine("Printing done: " + e.Success);
                    waitEvent.Set();
                };
                return printSettings; 
            });


            browser.PrintHandler = handler;
            browser.Print();
            waitEvent.WaitOne();
        } 

        class MyPDFPrintHandler : PrintHandler 
        { 

            Func<PrintJob, PrintSettings> func; 

            public MyPDFPrintHandler(Func<PrintJob, PrintSettings> func) 
            { 
                this.func = func; 
            } 
            public PrintStatus OnPrint(PrintJob printJob) 
            {
                PrintSettings printSettings = func(printJob);
                printSettings.PrintToPDF = true;
                printSettings.Landscape = true;
                printSettings.PrintBackgrounds = true; 

                return PrintStatus.CONTINUE; 
            }


        } 
    }
}

如果您将该扩展程序添加到项目中,则可以使用如下代码。

手势识别器:

public extension UITableView {

  /// This method returns the indexPath of the cell that contains the specified view
  /// - parameter view: The view to find.
  /// - returns: The indexPath of the cell containing the view, or nil if it can't be found

  func indexPathForView(_ view: UIView) -> IndexPath? {
    let origin = view.bounds.origin
    let viewOrigin = self.convert(origin, from: view)
    let indexPath = self.indexPathForRow(at: viewOrigin)
    return indexPath
  }
}

或者,对于按钮操作:

@objc func alertClicked(sender: UIGestureRecognizer){
  let view = sender.view
  let indexPath = tableView.indexPathForView(view)
  //Do whatever you need to do with the indexPath
}

答案 1 :(得分:0)

给每个单元格一个唯一的标签,然后:

updated_at

并将此函数添加到CustomCell类:

main()
{
  short arr[] = {2,10,-15,20};
  short size = 4;
  bobbleSort<short, short*>(size, arr);
}

template<class FIRST_TYPE, class SECOND_TYPE>
void bobbleSort(FIRST_TYPE size, SECOND_TYPE arr)
{
  arr[2]++;
}

答案 2 :(得分:0)

我个人更喜欢对TableViewCell进行子类化,并使用委托方法将抽头发送回TableView。您将需要在TableViewCell中提供并保存indexPath并使用委托方法将其传回,这在技术上打破了MVC,但个人代码更加清晰。如果您对此感兴趣,我可以发布代码。