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”到另一个类?的主要内容,如果未能解决你的问题,请参考以下文章
使用 UILocalizedIndexedCollation 在 Swift 4.2 中创建 tableView 部分索引时出现错误“无法识别的选择器发送到实例”
如何使用 Swift 从 tableview 和 sqlite3 中删除
如何使用 Swift 保存从 tableView 上的 textField 收到的用户答案
如何在 swift 3 中将图像从服务器加载到 tableView 单元格?