Swift 4.2 - 如何从 tableView 中的“didSelectRowAtIndexPath”方法调用“indexPath.row”到另一个类?

Posted

技术标签:

【中文标题】Swift 4.2 - 如何从 tableView 中的“didSelectRowAtIndexPath”方法调用“indexPath.row”到另一个类?【英文标题】:Swift 4.2 - How to call "indexPath.row" from "didSelectRowAtIndexPath" method in a tableView to another class? 【发布时间】:2018-12-25 17:31:02 【问题描述】:

我有两个视图控制器。一个有一个 tableView,其中有一些来自数组的单元格;另一个是一个 viewController,它包含一个我想展示一些本地 html 文件的 webkit。我还将 webKit 页面定义为 tableView 的下一页。 我想要的是,当用户在 tableView 中选择一个单元格时,根据选择的单元格,它转到 webkit 页面,并且运行某些部分代码供用户显示特定的 HTML。换句话说,我在 tableViewCells 中有 5 个 HTML 文件和 5 个项目 因此,例如,如果用户选择第一个项目,HTML1 会显示给他,如果他选择第二个单元格,则 HTML2 会显示给他,等等。

我尝试了很多方法。但什么也没发生。还尝试从 tableview 类创建实例对象... 在 *** 中也尝试了一些相同的问题,但没有成功

首页:

var arr = ["masoud" , "hossein", "reza" , "shiva" , "fateme"]


 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
        print("item selected is : \(indexPath.row)")
       // if indexPath.row == 1 

            performSegue(withIdentifier: "TableSegue", sender: nil)

        //

        tableView.deselectRow(at: indexPath, animated: true)
    



    override func prepare(for segue: UIStoryboardSegue, sender: Any?) 

        switch (segue.destination.view, segue.destination, sender) 

        case let (_, controller as WebKitController, indexPath as     NSIndexPath):
            controller.indexPath = indexPath
            break
        default:
            break
        
    

第二页:

import WebKit

class WebKitController: UIViewController, WKUIDelegate, WKNavigationDelegate 

    @IBOutlet weak var myWebKit: WKWebView!

    var reza : String = String()

    var indexPath: NSIndexPath? 

        didSet 
            reza = (indexPath?.row.description)!
            print(indexPath?.row as Any)

            self.myWebKit.uiDelegate = self
            self.myWebKit.navigationDelegate = self

        

    


    override func viewDidLoad() 
        super.viewDidLoad()
    let url = Bundle.main.url(forResource: "reza", withExtension: "html", subdirectory: "ReZeynoo2")!
                        myWebKit.loadFileURL(url, allowingReadAccessTo: url)
                        let request = URLRequest(url: url)
                        myWebKit.load(request)


        self.myWebKit.uiDelegate = self
        self.myWebKit.navigationDelegate = self
        

【问题讨论】:

【参考方案1】:

作为替代方法

我不会存储一个简单的数组,而是选择或不选择名称和布尔结构

struct CellData 
   let name: String!
   let isSelected: Bool!
   let index: Int!

   init(name: String, isSelected: Bool, index: Int) 
       self.name = name
       self.isSelected = isSelected
       self.index = index
   

然后在 didSelectAtRow func 中将选中被点击的单元格并使用此信息为 segue func 做准备

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
    self.deselectAll()
    self.cellItems[indexPath.row].isSelected = true
    performSegue(withIdentifier: "TableSegue", sender: nil)


override func prepare(for segue: UIStoryboardSegue, sender: Any?) 

    switch (segue.destination.view, segue.destination, sender) 

    case let (_, controller as WebKitController, indexPath as     NSIndexPath):
        if let item = cellItems.first(where: $0.isSelected == true) 
            controller.indexPath = item.index
        
        break
    default:
        break
    


private func deselectAll() 
    for item in cellItems 
        item.isSelected = false
    

【讨论】:

感谢您的帮助我想知道如何使用它。我的意思是如何在 secondViewController 中呈现它 我现在也不知道如何定义初始化。由于这种情况,您能否编写整个代码?我对此表示赞赏。非常感谢 @RezzaKashli 请看一下,如果您需要更多解释,请告诉我【参考方案2】:

您需要在WebKitController 类中创建一个Int 变量为selectedRow,其中选定的行将从表格视图单元格选择中分配,

// MARK: - Table view delegates
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
    self.performSegue(withIdentifier: "TableSegue", sender: indexPath)


override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
    if segue.identifier == "TableSegue", let indexPath = sender as? IndexPath 
        let webController = segue.destination as? WebKitController
        webController.selectedRow = indexPath.row
    

【讨论】:

你应该在 if 语句中的 prepare(for:sender:) 中向下转换 sender,你也不需要保护语句,因为你确定你将 IndexPath 作为发件人传递。所以:webController.selectedRow = (sender as! IndexPath).row 是的,我们也可以这样做,好建议,更新答案 我添加了if let,因为我想避免强制展开 @Bappaditya 感谢您的回答,但是如何在 webKit 类中使用或呈现 indexPath 值?对不起,我很困惑;( class WebKitController: UIViewController, WKUIDelegate, WKNavigationDelegate var selectedRow : Int? 像这样。这个 selectedRow 将保存所选索引路径的行值的值,您可以使用此值【参考方案3】:

我认为您可以将您的indexpath.row 值传递给您的perfomSegue 的发件人,而您的第二个视图控制器只需使用它

这里是代码

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
    performSegue(withIdentifier: "secondvc", sender: indexPath.row)

只需在发件人中发送indexpath.row

override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
    if segue.identifier == "secondvc"
        let vc = segue.destination as! SecondViewController
        vc.row = sender as! Int
    

【讨论】:

怎么做?

以上是关于Swift 4.2 - 如何从 tableView 中的“didSelectRowAtIndexPath”方法调用“indexPath.row”到另一个类?的主要内容,如果未能解决你的问题,请参考以下文章

使用 UILocalizedIndexedCollat​​ion 在 Swift 4.2 中创建 tableView 部分索引时出现错误“无法识别的选择器发送到实例”

如何使用 Swift 从 tableview 和 sqlite3 中删除

如何使用 Swift 保存从 tableView 上的 textField 收到的用户答案

如何在 swift 3 中将图像从服务器加载到 tableView 单元格?

如何从数据核心 swift 4 中删除 tableview index.row

如何使用 Swift 从 tableview 单元格中获取数据而不显示在标签上?