我有一个包含两个单元格的tableView。第一个单元格包含标签,第二个单元格包含DatePicker。第一个单元格使用类:
import UIKit
class cell1: UITableViewCell {
@IBOutlet weak var label1: UILabel!
}
另一个单元格使用该类:
import UIKit
class cell2: UITableViewCell {
@IBOutlet weak var outletPicker: UIDatePicker!
@IBAction func actionPicker(sender: AnyObject) {
let storyBoard = UIStoryboard(name : "Main" , bundle: nil)
let view = storyBoard.instantiateViewControllerWithIdentifier("ViewController") as! ViewController
view.lblString = String(outletPicker.date)
view.tableView.reloadData()
view.tableView.layoutIfNeeded()
}
}
正如您在DatePickerAction中看到的,我想更改第一个单元格的标签。在mainClass(" TableViewController类")中,我定义了一个名为lblString的字符串。并改变它。 MainClass代码如下所示。
import UIKit
class ViewController: UITableViewController {
var lblString : String = "initialString"
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 2
}
override func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return 30
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 1
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
{
if(indexPath.section == 0)
{
if(indexPath.row == 0)
{
let cell = tableView.dequeueReusableCellWithIdentifier("cell1") as! cell1
cell.label1.text = lblString;
return cell
}
}
else
{
if(indexPath.row == 0)
{
let cell = tableView.dequeueReusableCellWithIdentifier("cell2") as! cell2
return cell
}
}
return UITableViewCell()
}
override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
if(indexPath.section == 0)
{
return 40
}
else
{
return 120
}
}
}
在MyDatePicker执行和reloadData
之后,我可以看到cellForRowAtIndexPath
函数正在通过breakPoint运行。但是cell1的标签仍然是" initialString"。我该如何解决这个问题?
答案 0 :(得分:0)
在这种方法中:
@IBAction func actionPicker(sender: AnyObject) {
let storyBoard = UIStoryboard(name : "Main" , bundle: nil)
let view = storyBoard.instantiateViewControllerWithIdentifier("ViewController") as! ViewController
view.lblString = String(outletPicker.date)
view.tableView.reloadData()
view.tableView.layoutIfNeeded()
}
您正在实例化一个新的视图控制器,但您没有呈现它 - 它只会在方法结束时被释放。可能希望您想要将原始视图控制器的引用传递给该单元格,或者可以使用委托模式从单元格传递回视图控制器,或类似的东西。
答案 1 :(得分:0)
行
let view = storyBoard.instantiateViewControllerWithIdentifier("ViewController") as! ViewController
将instantiateViewcontroller实例化新对象。但它与您呈现的视图控制器没有任何关联。两者都不同,这就是为什么你没有在那里得到那个字符串。
这方面的解决方案很少。您必须使用Userdefaults来存储该值并返回此处,或者您可以使用触发tableview控制器类中的方法的协议。
答案 2 :(得分:0)
您可以使用委托方法解决它。 在第二个包含datePicker的tableViewCell中,使用pickDate函数创建一个协议:
import UIKit
protocol pickDateProtocol {
func pickDate(cell:YourTableViewCell)
}
class cell2: UITableViewCell {
//outlets
@IBOutlet var outletPicker: UIDatePicker!
//variables
var delegate:pickDateProtocol?
var dateValue: String! = nil
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
@IBAction func datePickerAction(_ sender: Any) {
delegate?.pickDate(cell:self)
dateValue = String(outletPicker.date)
}
}
在您的ViewController中,您将拥有:
class ViewController: UITableViewController, pickDateProtocol {
var lblString : String = "initialString"
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 2
}
override func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return 30
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 1
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
{
if(indexPath.section == 0) {
if(indexPath.row == 0) {
let cell = tableView.dequeueReusableCellWithIdentifier("cell1") as! cell1
cell.label1.text = lblString;
return cell
}
}else {
if(indexPath.row == 1) {
let cell = tableView.dequeueReusableCellWithIdentifier("cell2") as! cell2
cell.delegate = self
return cell
}
}
return UITableViewCell()
}
override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
if(indexPath.section == 0) {
return 40
}else {
return 120
}
}
// Mark: - Pick your date
func pickDate(cell:cell2) {
lblString = cell.dateValue
tableView.reloadData()
}
}