我希望在选择表格单元格时打开导航控制器。导航控制器必须具有所选单元格中包含的文本的标题。
我认为我与我的代码非常接近,但是似乎无法弄清楚我在做什么错。
当我从表格中的一个单元格上选择时,什么都不会打开。
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
// Retrieve cell
let cellIdentifier: String = "stockCell"
let myCell: UITableViewCell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier)!
myCell.textLabel?.textAlignment = .center
myCell.textLabel?.font = .boldSystemFont(ofSize: 18)
// Get the stock to be shown
let item: StockModel = feedItems[indexPath.row] as! StockModel
// Configure our cell title made up of name and price
let titleStr = [item.customer].compactMap { $0 }.joined(separator: "-")
print(titleStr)
// Get references to labels of cell
myCell.textLabel!.text = titleStr
return myCell
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let item: StockModel = feedItems[indexPath.row] as! StockModel
let titleStr = [item.customer].compactMap { $0 }.joined(separator: "-")
print(titleStr)
}
func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "customerDetails" {
let destinationVC = segue.destination as UIViewController
let cellIdentifier: String = "stockCell"
let myCell: UITableViewCell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier)!
destinationVC.navigationItem.title = myCell.textLabel!.text
}
}
}
新更新:
接下来的工作:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let cellIdentifier: String = "stockCell"
let myCell: UITableViewCell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier)!
myCell.textLabel?.textAlignment = .center
// Get the stock to be shown
let item: StockModel = feedItems[indexPath.row] as! StockModel
// Configure our cell title made up of name and price
let titleStr = [item.customer].compactMap { $0 }.joined(separator: "-")
print(titleStr)
// Get references to labels of cell
myCell.textLabel!.text = titleStr
let controller = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "detailController")
controller.title = titleStr
navigationController?.pushViewController(controller, animated: true)
}
但是我需要视图控制器将其自身显示为“显示详细信息”故事板样式,其中detailController覆盖了FirstViewController。
你不能回去的地方。
答案 0 :(得分:1)
检查segue是否已连接到main.storyboard文件中。如果是,请检查标识符是否与代码中的标识符匹配。如果这不起作用,则可能是因为您在prepareForSegue中创建了一个新单元格,并且要修复该问题,因此必须为每个单元格创建一个全局变量。如果所有方法都不起作用,请告诉我。您可以附加main.storyboard文件吗?
答案 1 :(得分:1)
在这种情况下,最好只是以编程方式推送视图控制器。一个非常简单的完整示例如下所示:
class ViewController: UIViewController {
let titles: [String] = ["First", "Second", "Third"]
override func viewDidLoad() {
super.viewDidLoad()
}
}
// MARK: - UITableViewDelegate, UITableViewDataSource
extension ViewController: UITableViewDelegate, UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return titles.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = UITableViewCell(style: .default, reuseIdentifier: nil)
cell.textLabel?.text = titles[indexPath.row]
return cell
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let controller = UIViewController() // or UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "whateverIdentifierISetInStoryboard")
controller.title = titles[indexPath.row]
navigationController?.pushViewController(controller, animated: true)
}
}
因此,使用navigationController?.pushViewController(controller, animated: true)
的方法将显示一个新的视图控制器,其动画从右到左。
只需在视图控制器上直接设置标题即可,可以使用UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "whateverIdentifierISetInStoryboard")
从情节提要中创建标题。
这假定此视图控制器实际上已经在导航控制器上。
如果您确实需要对segue执行此操作,则需要使用标识符手动调用segue。您还可以将标题作为sender
参数发送。
self.performSegue(withIdentifier: "customerDetails", sender: titles[indexPath.row])
在您的情况下,可能类似于:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let item: StockModel = feedItems[indexPath.row] as! StockModel
let titleStr = [item.customer].compactMap { $0 }.joined(separator: "-")
self.performSegue(withIdentifier: "customerDetails", sender: titleStr)
}
现在只需使用此标题:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "customerDetails" {
let destinationVC = segue.destination as UIViewController
destinationVC.title = sender as? String
}
}
另一种方法是将当前标题保存在属性上,然后在准备好segue时使用它:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let item: StockModel = feedItems[indexPath.row] as! StockModel
let titleStr = [item.customer].compactMap { $0 }.joined(separator: "-")
self.nextScreenTitle = titleStr
self.performSegue(withIdentifier: "customerDetails", sender: self)
}
然后使用:
var nextScreenTitle: String?
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "customerDetails" {
let destinationVC = segue.destination as UIViewController
destinationVC.title = nextScreenTitle
}
}
答案 2 :(得分:1)
您应该在 deistinationVC 中使用变量,然后在 ViewDidLoad 中使用“ navigationItem.title”
在 firstViewController 中:
func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "customerDetails" {
let destinationVC = segue.destination as UIViewController
let cellIdentifier: String = "stockCell"
let myCell: UITableViewCell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier)!
destinationVC.navTitle = myCell.textLabel!.text
}
}
和 SecondViewController :
class secondViewcontroller : UIViewController{
var navTitle = string()
override func viewDidLoad() {
navigationItem.title = navTitle
}
答案 3 :(得分:1)
在您的更新版本中执行此操作
let controller = storyboard.instantiateviewcontroller(withIdentifier: "youridentifier") as? "name of your view controller"
navigationController?.present(controller, animated: true, completion: nil)