2016-12-20 67 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() 
} 
} 
相關問題