【发布时间】:2018-06-16 05:00:35
【问题描述】:
我正在尝试使用 TableViewController 和 ViewController 之间的 segue 传递两个字符串值,其中包含“Bar Name”及其各自的“Street Name”的值。我正在使用一个名为HomeController 的类和另一个名为BarPage 的类。我为主屏幕准备了以下代码,这是一个包含单元格的表格视图控制器,当单击它时,应该执行我在故事板上包含的 segue。我删除了一些多余的代码来解释这个问题:
import UIKit
import Firebase
class HomeController: UIViewController, UITableViewDelegate, UITableViewDataSource{
let barsArray = [Data(image: "bar1", street: "123 North Street"),
Data(image: "bar2", street: "345 South Street"),
Data(image: "bar3", street: "678 West Street")]
let tableView: UITableView = {
let tv = UITableView()
tv.separatorStyle = .none
tv.allowsSelection = true
return tv
}()
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return barsArray.count
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return 100
}
func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! BarCell
cell.barImageView.image = UIImage(named: barsArray[indexPath.item].image!)
cell.barCoverLabel.text = "Street: " + barsArray[indexPath.item].street!
return cell
}
var locationName : String?
var locationStreet : String?
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
let barPage = segue.destination as! BarPage
barPage.barName = locationName!
barPage.barStreet = locationStreet!
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
locationName = self.barsArray[indexPath.row].image
locationStreet = self.barsArray[indexPath.row].street
// WHEN USER PRESSES A ROW, PERFORM SEGUE
performSegue(withIdentifier: "mySegue", sender: self)
// Then enter the second view controller
present(BarPage(), animated: true, completion: nil)
}
override func viewDidLoad() {
super.viewDidLoad()
self.tableView.backgroundColor = .black
setUpTableView()
}
func setUpTableView(){
tableView.dataSource = self
tableView.delegate = self
tableView.register(BarCell.self, forCellReuseIdentifier: "cell")
view.addSubview(tableView)
.... add anchors and constraints for table view ..........
}
}
var home: HomeController?
class BarCell: UITableViewCell{
... add custom styling for each cell of the table view ....
override init(style: UITableViewCellStyle, reuseIdentifier: String?){
super.init(style: style, reuseIdentifier: reuseIdentifier)
setup()
}
func setup(){
.......... add anchors and constraints for the cell..........
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
这是来自 View Controller BarPage 的代码,它应该从他的 segue 中检索字符串。
import UIKit
import Firebase
class BarPage: UIViewController{
let homeController = HomeController()
// These, in theory, should be the variables that retrieve the strings through my segue
var barName = String()
var barStreet = String()
public let barStreet: UILabel = {
var label = UILabel()
label.text = "The street is: "// + barStreet
label.textColor = .black
label.font = UIFont.boldSystemFont(ofSize: 16)
return label
}()
let barImage: UIImageView = {
let iv = UIImageView()
iv.image = UIImage(named: barName) // Should retrieve the image based on the string that is passed
iv.contentMode = .scaleAspectFill
iv.backgroundColor = .yellow
//iv.clipsToBounds = true
return iv
}()
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = UIColor.mint()
view.addSubview(barStreet)
view.addSubview(barImage)
positionElements()
}
func positionElements(){
.......... add anchors and constraints for the elements..........
}
}
如果我在不包含 segue 的情况下运行我的代码,则转换效果很好。但是,如果我包含 Segue,则会收到以下错误:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException',
reason: 'Receiver (<ProjectName.HomeController: 0x7f9fcec0fb10>) has
no segue with identifier 'mySegue''
如果我的故事板中确实有一个带有该标识符的 segue,这怎么可能?这是我的故事板的图片,显示了我正在使用的标识符:
正如您在右侧看到的,相同的标识符与我的故事板中的 segue 匹配,但我的错误表明它无法找到。我该如何解决这个问题?这是因为我试图从 TableViewController 执行 Segue 吗?成为 Swift 用户的第一个月,如有任何歧义,我们深表歉意。任何可以为我指明正确方向的提示/建议都会非常有帮助。
【问题讨论】:
-
您执行
segue,然后手动呈现BarPage的(不同)实例。你不能同时使用两者。既然你一直在使用故事板,你为什么要在代码中创建表格视图?是不是特别爽?并考虑实例HomeController()是不是故事板中的实例。 -
@vadian 我以编程方式创建了整个表格视图,并且没有实现故事板就没有办法执行segue。这就是为什么我在上面的图片中包含了两个视图控制器。您能否澄清一下您的意思是“实例 HomeController() 不是情节提要中的实例”?抱歉,对故事板很不熟悉。
-
视图控制器的默认初始化器
()创建一个新的控制器空白实例,该实例与情节提要中的实例无关。如果要引用故事板中的实例,则需要通过 segue 传递引用。如果您是初学者,请寻找在故事板中设计 UI 的教程。方便多了。
标签: ios swift uitableview segue uistoryboardsegue