2016-08-28 18 views
0

ViewControllerにtableViewを設定しました。このテーブルビューには、1セクション、2プロトタイプセルがあります.1セクションはセクションの行数を戻すために使用され、もう1つはカスタムヘッダーの表示に使用されます。 ヘッダーのラベルにロードするデータは、行が選択されるたびに生成されます。問題は、ViewControllerが最初にロードされ、行が選択されるたびに、データがヘッダーのラベルで更新されないことです。 戻るボタンを押して、ヘッダーを保持するViewControllerに戻ると、データはヘッダーに添付されたラベルで更新されます。 私は何が間違っていますか?tableViewヘッダがデータを更新しないSwift

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return frequency.count 
} 

func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
    return 1 
} 


func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { 
    let headerCell = tableView.dequeueReusableCellWithIdentifier("customheader") as! CustomHeader 

    headerCell.dateHeaderlabel.text = StructS.headerDate 
    headerCell.hourHeaderlabel.text = StructS.headerHours + "-" 
     headerCell.totalHoursHeaderlabel.text = String(StructS.numberHours) 
     headerCell.priceHeaderlabel.text = String(StructS.price) 
     headerCell.backgroundColor = UIColor(red:72/255,green:141/255,blue:200/255,alpha:0.9) 
    tableView.reloadSections(NSIndexSet(index: 0), withRowAnimation: .None) 
     return headerCell 
} 


func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { 
    return 70.0 
} 

BeforeAfter

+0

データを更新した後にテーブルビューをリロードする必要があります。 –

+0

@UmairAfzalもし 'self.tableView.reloadSections(NSIndexSet(index:0)、withRowAnimation:.None)'を実行した場合、 '別のエラー:'予想される宣言 'が出ます。 – bibscy

+0

@bogdanbarbulescuデータをロードしたときのコードを表示します –

答えて

1

細胞didSelectRowAtIndexPath法上のユーザのタップが呼び出されるたび。ですから、NSUserDefaultsに選択した値を保存してから、その値をユーザーのデフォルト値から取得してセクションヘッダをポーズすることができます。このようにして、テーブルビューに戻ると、最後に選択した行のデータがセクションヘッダーに表示されます。

+0

NSUserDefaultsを使用すると、セクションヘッダーにもっと多くのラベルがあるので、たくさんのコードを書く必要があります。関数を使って、ViewDidLoadで私のデータを更新するよりエレガントな方法があるのか​​どうか疑問に思っていました... – bibscy

+0

はい、エレガントな方法がありますが、NSUserDefaultsは既に使用していたためです。 –

+0

私はあなたの答えを受け入れました。時間がある場合は、ViewDidLoadのヘッダーセクションにデータを読み込む方法について、その優雅な方法で回答を更新してください。他の人たちも便利な2番目の解決策を見つけてくれるはずです。多くのお礼ありがとうございます – bibscy

0

UIViewControllerにUITableViewオブジェクトがある場合。 main.storyboardにUIViewControllerをdataSourceとして設定し、委譲します。次に、UIViewControllerのサブクラスで、selfをテーブルビューのデリゲートとデータソースとして設定します。 ViewControllerが最初にロードされたときにデータを更新する必要があるのでのviewDidLoad FUNC オーバーライド(){ self.tableView.delegate =自己 self.tableView.dataSource =自己 は}

、ヘッダラベルは、更新されません(NSUserDefaultsに保存されている)以前に選択された行に基づいて生成された情報をヘッダに追加します。

override func viewWillAppear(animated: Bool) { 
    super.viewWillAppear(animated) 

    // retrieve indexPathForCellSelected from NSUserDefaults 
    if let retrievedIndexPath = NSUserDefaults.standardUserDefaults().dataForKey(indexKey) { 
if let data1 = NSKeyedUnarchiver.unarchiveObjectWithData(retrievedIndexPath) as? NSIndexPath { 
    indexPathForCellSelected = data1 

    // inform the delegate that the row has already been selected 
      self.tableView(self.tableView, didSelectRowAtIndexPath: indexPathForCellSelected!) 

} 
    // handle the selection of the row so as to update the values of labels in section header 
    if indexPathForCellSelected == nil { 
     // construct an indexPath for the row we want to select when no previous row was selected (not already saved in NSUserDefaults) 
      let rowToSelect:NSIndexPath = NSIndexPath(forRow: 1, inSection: 0) 

     /* select the row at `rowToSelect` indexPath. This will just register the selectd row, However,the code that you have in tableView:didSelectRowAtIndexPath: is not yet executed because the delegate for the tablewView object in the ViewController has not been called yet. */ 

     self.tableView.selectRowAtIndexPath(rowToSelect, animated: true, scrollPosition: UITableViewScrollPosition.None) 

     // inform the delegate that the row was selected 
     // stackoverflow.com/questions/24787098/programmatically-emulate-the-selection-in-uitableviewcontroller-in-swift 
      self.tableView(self.tableView, didSelectRowAtIndexPath: rowToSelect) 
    } 

} 
+0

@Umair Afzal私は以前に言及した問題への回答を追加しました。これに関する考えがあれば、それらを共有してください。 – bibscy

関連する問題