如何在 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 之间拆分、子字符串和排序字符串,使其正确显示在我的表中?的主要内容,如果未能解决你的问题,请参考以下文章