如何从 UITableView 获取行索引,其中数组列表由追加到类

Posted

技术标签:

【中文标题】如何从 UITableView 获取行索引,其中数组列表由追加到类【英文标题】:How to get row index from UITableView which the array list made by append to a class 【发布时间】:2019-07-03 18:49:54 【问题描述】:

如何从 UITableView 中获取行索引,该数组列表由附加到对象类。 我想根据对象的值获取行索引,我需要滚动到我只知道对象的值但不知道行索引的行。

以下是创建数组并显示到 UITableView 的代码。

let paging: Int
let obj: Any
var currentAyaPlaying: Int?
var listArr = [] as [Any]


override func viewDidLoad() 
    super.viewDidLoad()

    tableView.estimatedRowHeight = 700
    tableView.rowHeight = UITableView.automaticDimension
    tableView.allowsSelection = true

    if paging == Paging.SURA 
        let sura = obj as! Sura
        listArr.append(Sura(sura.index, sura.start, sura.ayas, sura.type, sura.img, sura.name, sura.translate))
        for aya in 1...sura.ayas 
            listArr.append(Mark(sura.index, aya))
        
     else if (paging == Paging.JUZ)
        let juz = obj as! Juz
        for suras in juz.sura_start...juz.sura_end 
            let sura = MetaData().mSuras[suras - 1]
            if juz.sura_start == suras 
                for aya in juz.aya_start...(juz.sura_end == suras ? juz.aya_end : sura.ayas) 
                    listArr.append(Mark(suras, aya))
                
             else if juz.sura_end == suras 
                listArr.append(Sura(sura.index, sura.start, sura.ayas, sura.type, sura.img, sura.name, sura.translate))
                for aya in 1...juz.aya_end 
                    listArr.append(Mark(suras, aya))
                
             else 
                listArr.append(Sura(sura.index, sura.start, sura.ayas, sura.type, sura.img, sura.name, sura.translate))
                for aya in 1...sura.ayas 
                    listArr.append(Mark(suras, aya))
                
            
        
    

    NotificationCenter.default.addObserver(self, selector: #selector(appearNotifAudioReload(_:)), name: NSNotification.Name(rawValue: NotifKey.actAudioReloadFromParentToChild), object: nil)


@objc func appearNotifAudioReload(_ notification: Notification) 
    guard let sura = notification.userInfo?["sura"] as? Int else  return 
    guard let aya = notification.userInfo?["aya"] as? Int else  return 
    print("sura: \(sura)")
    print("aya: \(aya)")
    self.currentAyaPlaying = aya
    if paging == Paging.SURA 
        let indexPath = NSIndexPath(row: self.currentAyaPlaying!, section: 0)
        tableView.scrollToRow(at: indexPath as IndexPath, at: .top, animated: true)
     else if paging == Paging.JUZ 
        let IStackInHere = Mark(sura, aya) // how to get the row index from this data?

        let indexPath = NSIndexPath(row: IStackInHere, section: 0)
        tableView.scrollToRow(at: indexPath as IndexPath, at: .top, animated: true)
    

    tableView.reloadData()


override func numberOfSections(in tableView: UITableView) -> Int 
    return 1


override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    return listArr.count


override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    if (listArr[indexPath.row] as? Sura) != nil 
        tableView.register(UINib(nibName: identifierAyaHeader, bundle: Bundle.main), forCellReuseIdentifier: identifierAyaHeader)
        let cell = tableView.dequeueReusableCell(withIdentifier: identifierAyaHeader, for: indexPath) as! AyaCellHeader
        let data = listArr[indexPath.row] as! Sura
        cell.configureWithData(data)
        return cell
    

    tableView.register(UINib(nibName: identifierAya, bundle: Bundle.main), forCellReuseIdentifier: identifierAya)
    let cell = tableView.dequeueReusableCell(withIdentifier: identifierAya, for: indexPath) as! AyaCell
    let data = listArr[indexPath.row] as! Mark
    cell.configureWithData(data)

    return cell


override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
    if (listArr[indexPath.row] as? Mark) != nil 
        tableView.deselectRow(at: indexPath, animated: false)
        let mark = listArr[indexPath.row] as! Mark
        showActionBottom(mark: mark)
    

我想在 func 中出现 paging == Paging.JUZ 的情况下获取它NotifAudioReload,我只是尝试通过以下方式获取它:

let index = listArr.firstIndex$0 === Mark(sura, aya)

但没有幸运和错误

“二元运算符'==='不能应用于'Any'类型的操作数和 '标记'"

我知道这个论坛不是为了解决我的编码问题,但现在我真的很困扰。

提前致谢。

【问题讨论】:

你说你收到一个错误。你能告诉我们错误是什么意思吗? "但没有幸运和错误" 另外,你能发布Mark类/结构的代码吗? 嗨@Rengers,马克是结构。 嗨@Rengers:代码行中的错误是“二元运算符'==='不能应用于'Any'和'Mark'类型的操作数” 【参考方案1】:

您需要使用==(等号)来比较相等性。假设 Mark 结构符合 Equatable,您可以使用以下内容:

let index = listArr.firstIndex  $0 as! Mark == Mark(sura, aya) 

【讨论】:

您好,现在的错误是:“二元运算符 '==' 不能应用于两个 'Mark' 操作数”

以上是关于如何从 UITableView 获取行索引,其中数组列表由追加到类的主要内容,如果未能解决你的问题,请参考以下文章

尝试从 iOS 中 UITableView 的自定义单元格内的 textField 获取活动单元格的索引

从 NSArray 为 UITableView 创建索引

如何从熊猫系列中获取包含行索引的列表[重复]

UITableViewCell 内 UITableView 的动态行高

删除行 UITableView 索引问题

如何从 UIButton 操作方法获取 UITableViewCell 对象?