TableView无法使用ReloadData()

时间:2016-12-20 19:09:48

标签: ios swift uitableview tableview

我有一个包含两个单元格的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"。我该如何解决这个问题?

MyTableViewScreen

3 个答案:

答案 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()
 }
 }