2016-04-14 5 views
-1

私には問題があります。私はiPhoneアプリプログラミングとSwiftを初めて使っているので分かりません。Swiftのテーブルセルから読み込もうとしたときにゼロが見つかりました

私はいくつかの結果を表示するために使用するSwiftのTableViewを持っています。各セルにボタンを追加して、ユーザーが異なるセルを選択してから、削除を押してセルに表示されている結果を削除できるようにしました。

うまくいきましたが、今ではnil-exceptionを得るようになりました。

特定の行のセルを取得しようとすると、プログラムはgetIndexToDelete関数でクラッシュします。ここで

は、私はテーブルを扱うコードです:私はもちろんのif節内let cell = tableView.cellForRowAtIndexPath(indexPath) as! ResultTableCellを置くことができます

import UIKit 

class ResultTableCell: UITableViewCell { 

@IBOutlet weak var ResultField: UITextField! 

@IBOutlet weak var CheckBoxButton: UIButton! 

} 

が、その後、他の奇妙なこと:ここで

import UIKit 

class DailyResultTable: UIViewController, UITableViewDataSource,  UITableViewDelegate { 
var results = Results() 
var yearShownIndex = 0 
var monthShownIndex = 0 
var dayShownIndex = 0 
@IBOutlet weak var tableView: UITableView! 

@IBOutlet weak var DeleteButton: UIButton! 


override func viewDidLoad() { 
    super.viewDidLoad() 
// self.view.backgroundColor = UIColor(patternImage: UIImage(named: "StatisticBackground")!) 

} 

// DataSource 
func numberOfSectionsInTableView(tableview: UITableView) -> Int { 
    return 1 
} 

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    // return (self.results?.getDayList(yearShownIndex, posMonth: monthShownIndex).count)! 
    print("return number of rows") 
    if (results.getYearList().count > 0){ 
     if (results.getMonthList(yearShownIndex).count > 0){ 
      if (results.getDayList(yearShownIndex, posMonth: monthShownIndex).count > dayShownIndex){ 
      return (results.getDayList(yearShownIndex, posMonth: monthShownIndex)[dayShownIndex].results.count) 
      } 
     } 
    } 
    print("No numbers to show return 0") 
    return 0; 
} 

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier("DayResultCell", forIndexPath: indexPath) as! ResultTableCell 
    let row = indexPath.row 
    //cell.ResultField.text = String((results?.getDayList(yearShownIndex, posMonth: monthShownIndex)[row].day)!) + "/" + String((results?.getMonthList(yearShownIndex)[monthShownIndex].month)!) 
    let res = results.getDayList(yearShownIndex, posMonth: monthShownIndex)[dayShownIndex].results[row].result 
    let maxRes = results.getDayList(yearShownIndex, posMonth: monthShownIndex)[dayShownIndex].results[row].maxresult 
    let discipline = results.getDayList(yearShownIndex, posMonth: monthShownIndex)[dayShownIndex].results[row].discipline 
    let text1 = String(res) + "/" 
    let text2 = String(maxRes) 
    let text3 = " - " + discipline 
    let text = text1 + text2 + text3 
    print(text) 
    cell.ResultField.text = text 
    return cell 
} 


// Delegate 
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
} 
@IBAction func CheckBox(sender: UIButton) { 
    let image = UIImage(named: "Selected") as UIImage! 
    let selected = sender.selected 
    sender.selected = !selected 
    sender.setImage(image, forState: .Selected) 
} 

func getIndexToDelete()->[Int]{ 
    var indices = [Int]() 

    for i in 0..<tableView.numberOfRowsInSection(0){ 
     let indexPath = NSIndexPath(forRow: i, inSection: 0) 
     // Here does the program crash 
     let cell = tableView.cellForRowAtIndexPath(indexPath) as! ResultTableCell 
     if (cell.CheckBoxButton.selected){ 
      indices += [i] 

    } 
    } 
    return indices 
} 

@IBAction func DeletePressed(sender: UIButton) { 
    let deleteIndices = getIndexToDelete() 
    var goback = false; 
    var count = 0; 
    for index in deleteIndices{ 
     print("Count: " + String(count)) 
     results.ListResults[yearShownIndex].months[monthShownIndex].day[dayShownIndex].results.removeAtIndex(index-count) 
     count += 1 
     print(String((results.getDayList(yearShownIndex, posMonth: monthShownIndex)[dayShownIndex].results.count))); 

    } 
    loadView() 
    results.recreatePlainResult() 
    results.saveResults() 

    if (results.ListResults[yearShownIndex].months[monthShownIndex].day[dayShownIndex].results.count == 0){ 
     print(String(results.ListResults[yearShownIndex].months[monthShownIndex].day.count)) 
     results.ListResults[yearShownIndex].months[monthShownIndex].day.removeAtIndex(dayShownIndex) 
     results.recreatePlainResult() 
     results.saveResults() 
     print(String(results.ListResults[yearShownIndex].months[monthShownIndex].day.count)) 
     goback = true 
    } 
    if (results.ListResults[yearShownIndex].months[monthShownIndex].day.count == 0){ 
     results.ListResults[yearShownIndex].months.removeAtIndex(monthShownIndex) 
     results.recreatePlainResult() 
     results.saveResults() 
     goback = true 
    } 
    if (results.ListResults[yearShownIndex].months.count == 0){ 
     results.ListResults.removeAtIndex(monthShownIndex) 
     results.recreatePlainResult() 
     results.saveResults() 
     goback = true 
    } 
    if (goback){ 
     // return; 
     navigationController?.popViewControllerAnimated(true) 
    } 
} 

} 

はResultTableCellです起こる

+0

もしあなたがテーブルビューで押されたボタンを決定したいのであれば、button.tag = indexPath.rowを設定することをお勧めします...この方法では、この恐ろしいことなしに押したボタンを正確に知ることができます。 cellForRowAtIndexPath –

答えて

3

'!'は使用しないでください。

cellForRowAtIndexPathは、UITableViewCell?を返します。コール時に行が表示されない場合は、Nilにすることができます。 if letを使用して実際にセルがあるかどうかを確認してから、目的のオブジェクトタイプにキャストしてください。

+0

しかし、行はどのように表示されませんか?変更してletを代わりに使用すると、いくつかの行を選択してdeleteを押すと動作します。テーブルビューが更新され、残りの結果のみが表示されます。しかし、新しい結果を選択して削除すると、すべてのテーブル行が空白になります。 –

+0

具体的なケースはわかりませんが、たとえば、UIに一度に7つの行を表示して10の結果が表示された場合、3つの結果には関連するセルがありません。 ( 'numberOfRowsInSection'から戻ってくる実際の行数を表示したいかもしれません。) –

0

がここで起こっていくつかのものがあり、のは

  1. クラッシュ部分は明らかである!nil値を強制するからである一つずつそれらを見てみましょうforループから行く
  2. 0から行数までですが、UITableViewCellインスタンスがリサイクルされるため、動作しません。
  3. チェックボックスの選択は、標準のiOSテーブルセルの選択ではありませんが、何かもっとカスタムです。

あなたは、このメソッドを使用でき、内蔵のUITableViewの選択動作を使用していた場合:カスタムのチェックボックスの選択を継続して使用する場合はこれを行うには、おそらく最も簡単な方法よりも、

iOS, How to find selected row Of UITableView?

を物事が選択されると、選択の変更を聞き、NSIndexPathを構築することです。その後、削除ボタンが押されると、事前に作成された索引を削除する準備ができて、選択されたものを検索するためにループする必要はありません。

+0

貴重なコメントありがとう!私が理解しているように、標準的な関数は行全体を選択することです?もし削除したいのであればボタンを押す方が直感的ですね。 –

+0

選択は1行または複数行です。 'NSIndexPath'は複数のものを持つことができますhttps://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSIndexPath_Class/ – slf

関連する問題