2016-12-20 69 views
0

我有一个tableView包含两个单元格。第一个单元格包含一个标签,第二个单元格包含一个DatePicker。第一个单元格使用类:TableView不更新与ReloadData()

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功能通过断点运行。但cell1的标签仍然是“initialString”。我该如何解决这个问题?

MyTableViewScreen

+0

'让故事板= UIStoryboard(名称: “主” ,bundle:nil) let view = storyBoard.instantiateViewControllerWithIdentifier(“ViewController”)as! ViewController'这给你一个单独的控制器实例。这不是同一个控制器。你可以做的是使用一个块将更改传递给主控制器 –

回答

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

你实例化一个新的视图控制器,但你不提出它 - 它只会得到在方法结束dealloced。很可能你想要的是将对原始视图控制器的引用传递给该单元格,或者可以使用委托模式从单元格传回视图控制器或类似的东西。

0

线

let view = storyBoard.instantiateViewControllerWithIdentifier("ViewController") as! ViewController 

将instantiateViewcontroller实例化新对象。但它与您正在呈现的视图控制器没有关系。两者都不同,这就是为什么你没有得到那个字符串。

对此很少有解决方案。要么你必须使用Userdefaults来存储这个值并返回到这里,或者你可以使用在tableview控制器类中触发一个方法的协议。

0

你可以用委托方法解决它。 在你的第二个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() 
} 
} 
相关问题