如何在 segues 之间拆分、子字符串和排序字符串,使其正确显示在我的表中?

Posted

技术标签:

【中文标题】如何在 segues 之间拆分、子字符串和排序字符串,使其正确显示在我的表中?【英文标题】:How to split, substring and sort strings between segues so it appears correctly in my table? 【发布时间】:2017-06-26 21:01:39 【问题描述】:

我有一个元素列表,格式如下:

let myTableData : [String] = [
    "var/lib/file1.txt",
    "var/lib/file2.txt",
    "home/user/Documents",
    "home/user/text.txt",
    "usr/bin/bash",
    "usr/bin/sh"
]

在我的视图控制器中,我有一个表格,其中 a 会以类似于文件浏览器的方式呈现数据。所以最初表格应该只包含并显示以下行:

var
home
usr

所以当用户按下var时,会触发一个segue,同一个viewcontroller会显示var下的数据,即 lib,当用户按下 lib 时,将触发一个 segue,然后表格将包含:

file1.txt
file2.txt

实际上 segue 导航工作得很好。只是当用户按下时,比如说usr,那么lib 不会显示在表格中,而是显示在`myTableData.xml 中的所有行。

以下是我目前编写的代码。查看func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 函数,我在其中对触发segue 时应显示的数据进行排序。

我不确定如何继续以我想要的方式获得它。有什么想法吗?

下面是代码。

import UIKit

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate 

    let myTableData : [String] = [
        "var/lib/file1.txt",
        "var/lib/file2.txt",
        "home/user/Documents",
        "home/user/text.txt",
        "usr/bin/bash",
        "usr/bin/sh"
    ]
    var currentObjects : [String] = []
    var splitRegex: String = "/"
    var currentPath: String = ""

    @IBOutlet weak var tableView: UITableView!

    override func viewDidLoad() 
        super.viewDidLoad()

        self.tableView.dataSource = self
        self.tableView.delegate = self
    

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


    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 

        currentObjects.removeAll()

        for name in myTableData 
            // First split the string
            let keysArr = name.components(separatedBy: splitRegex)
            // Then set currentPath to the first element of the splitted string (e.g. var or home or var/lib etc
            currentPath = keysArr[0]
            // Check if name contains the part 
            // (e.g. check if "usr/lib/file1.txt" contains "usr"
            if name.contains(currentPath) 

                let index = name.index(currentPath.startIndex, offsetBy: currentPath.characters.count)
                // Split, e.g split "var" out from var/lib/file.txt
                currentPath = name.substring(to: index)

                // Check if currentObjects contains currentPath
                if !currentObjects.contains(currentPath) 
                    currentObjects.append(currentPath)
                
            
        
        return currentObjects.count
    

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let cell = UITableViewCell()
        // Get current strings/paths from currentObjects
        let text = currentObjects[indexPath.row]
        cell.textLabel?.text = text

        return cell
    

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
        let cell = tableView.cellForRow(at: indexPath) as! UITableViewCell

        performSegue(withIdentifier: "show", sender: "select")
    

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
        if let destination = segue.destination as? ViewController 

            if let cell = sender as? String 
                destination.splitRegex = currentPath
            
        

    

这是结构:

编辑

override func viewWillDisappear(_ animated: Bool) 
    if (self.isMovingFromParentViewController) 
        currentPath.removeLast()
        tableView.reloadData()
    

【问题讨论】:

我建议将您的数据放入类型而不是字符串中。这应该可以让您发挥最大的作用。 【参考方案1】:

有几点:

    您在 ViewController 内部声明了变量,因此每个 ViewController 都将从自己的数据开始。在我的解决方案中,我使用了最懒惰的方法(不要在真正的应用程序中这样做!),您应该寻找更好的方法来处理视图控制器之间的数据 . 不要每次都创建新单元格,而是使用情节提要预取单元格 您无需手动触发 segue,它们已由 storyboard 管理。

    最后,这是工作代码;我将留给您(作为练习)如何正确管理向后导航。

    import UIKit
    
    
    let myTableData : [String] = [
        "var/lib/file1.txt",
        "var/lib/file2.txt",
        "home/user/Documents",
        "home/user/text.txt",
        "usr/bin/bash",
        "usr/bin/sh"
    ]
    
    var currentObjects : [String] = []
    var splitRegex: String = "/"
    var currentPath = [String]()
    
    class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate 
    
        @IBOutlet weak var tableView: UITableView!
    
        override func viewDidLoad() 
            super.viewDidLoad()
    
            self.tableView.dataSource = self
            self.tableView.delegate = self
        
    
        func numberOfSections(in tableView: UITableView) -> Int 
            return 1
        
    
        func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    
            currentObjects.removeAll()
    
            for name in myTableData 
    
                let keysArr = name.components(separatedBy: splitRegex)
    
                if currentPath.count == 0 || keysArr[currentPath.count - 1] == currentPath.last 
    
                    if !currentObjects.contains(keysArr[currentPath.count]) 
                        currentObjects.append(keysArr[currentPath.count])
                    
                
    
            
    
            return currentObjects.count
        
    
        func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    
            let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
            let text = currentObjects[indexPath.row]
            cell.textLabel?.text = text
    
            return cell
        
    
        func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
            currentPath.append(currentObjects[indexPath.row])
        
    
    

【讨论】:

感谢您的回复!我想最简单的方法是在导航回上一个视图控制器时跟踪存储在currentPath 中的哪些元素?或者有没有更有效的方法?我猜在视图控制器之间处理数据的最佳方式应该是将它们存储在单例类中。 请看我上面的编辑。那是我添加的让它工作的行,所以我可以前后导航。这是您认为的最佳解决方案吗?

以上是关于如何在 segues 之间拆分、子字符串和排序字符串,使其正确显示在我的表中?的主要内容,如果未能解决你的问题,请参考以下文章

分治:至少有K个重复字符的最长子串

Java在字符之间查找子字符串

如何在iOS上将字符串拆分为子字符串?

SQL 字符串按大小排序

在Java中将字符串拆分为等长的子字符串

如何在javascript中的两个分隔符之间拆分字符串?