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

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

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

首页:

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
        }

【问题讨论】:

    标签: ios iphone swift


    【解决方案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
        }
    }
    

    【讨论】:

    • 怎么做?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-28
    • 1970-01-01
    • 1970-01-01
    • 2015-06-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多