我正在使用Swift 3和Xcode 8.2。
您好,我将尝试充分解释我正在尝试做什么以及我做了什么,希望有人可以帮助我充实我的问题。
这是我的故事板。
它是标签栏控制器的第一个标签。它由一个表视图控制器(我们称之为表1)组成,单击它时单元格将显示另一个具有唯一信息的表视图控制器(表2)。例如,表1中的单元格标题为“水果”,“蔬菜”,“蛋白质”,单击“水果”时,表2显示“Apple”,“Orange”,“Pear”。
所以我的第一个问题是:我的故事板设置是否准确捕获了我希望表2单元格独特的行为,具体取决于表1中单击的内容?或表2的单元格是否完全相同?
继续:我已经成功生成了表1中的内容,但表2中的独特内容给我带来了麻烦。
表2内容在Tab Bar Controller的另一个选项卡上生成,我需要先将其传递到该视图中。
所以,在另一个标签中,我试图做这样的事情。基本上,尝试访问表2并在其中设置字段也会填充。
let table2VC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "table2VC") as! Table2VC
table2VC.unique_title_label = UILabel()
table2VC.unique_title_label.text = "Some unique text"
表2 VC
var unique_title_label : UILabel!
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
...
table2cell.titleLabel = unique_title_label
table2cell.mytvc = self
return table2cell
}
在Table2Cell中:
@IBOutlet weak var titleLabel : UILabel!
我已将插座与相应的表2标签相关联。但是,运行此选项时,不会填充任何唯一标签。它简单地说“标签”就像故事板一样。
非常感谢任何帮助。
答案 0 :(得分:0)
所以你希望在两个UITableViewControllers
之间传递数据。首先,您需要考虑一下data structure
,这意味着您需要在第一个tableView中显示数据,当然还需要在第二个tableView中显示数据。
由于第二个tableView正在等待第一个填充。所以你的数据结构非常重要。
例如:
struct personInfo {
var firstName:String
var lastName:String
var detailInfos:[String]
}
因此,在第一个TableView中,如您所知,每个都包含自己的数据,这意味着在当前示例中,每行将包含firstname
,lastname
和detailInfos
。< / p>
由于您使用的是tableView,因此您可以使用prepare(for segue: UIStoryboardSegue, sender: Any?)
或tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
不要同时使用两者,因为在didSelectRowAt
之前调用prepare会给您带来奇怪的行为。
我有完整的例子:
struct personInfo {
var firstName:String
var lastName:String
var detailInfos:[String]
}
enum segueIdentifier:String {
case first_id = "passDataViaSegue"
}
class FirstTableView: UITableViewController {
var personInfos:[personInfo]!
override func viewDidLoad() {
super.viewDidLoad()
personInfos = [ personInfo(firstName: "Joe", lastName: "Doe", detailInfos: [
"we need this datat","we are here my man","I am not amateur"
])
]
tableView.delegate = self
tableView.dataSource = self
tableView.reloadData()
}
override func tableView(_ tableView:UITableView, numberOfRowsInSection section:Int)->Int {
return personInfos.count
}
override func tableView(_ tableView:UITableView, cellForRowAt indexPath:IndexPath)->UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
cell.textLabel?.text = personInfos[indexPath.row].firstName
cell.detailTextLabel?.text = personInfos[indexPath.row].lastName
return cell
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == segueIdentifier.first_id.rawValue {
let destination = segue.destination as! SecondTableView
guard let row = tableView.indexPathForSelectedRow?.row else {
return
}
destination.detailArr = personInfos[row].detailInfos
}
}
}
class SecondTableView: UITableViewController {
var detailArr:[String]?
var _details = [String]()
override func viewDidLoad() {
super.viewDidLoad()
guard let details = detailArr else { return }
_details = details
DispatchQueue.main.async {
self.tableView.reloadData()
}
}
override func tableView(_ tableView:UITableView, numberOfRowsInSection section:Int)->Int {
return _details.count
}
override func tableView(_ tableView:UITableView, cellForRowAt indexPath:IndexPath)->UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
cell.textLabel?.text = _details[indexPath.row]
return cell
}
}
在此示例中,我使用的设置与您的设置相同,只是使用不同的数据,默认为TableViewCell
。