2011-06-21 6 views
0

私は他の記事の一部を読んだことがありますが、私の場合はうまくいくような正しい解決策が見つかりませんでした。私は、メインのアプリケーションデリゲートからインスタンス化され、それがアプリケーションデリゲートから作成されたUINavigationControllerインスタンスにプッシュされる他のビューを制御するUITableViewControllerクラスを持っています。UITableViewをリロードする

UINavigationToolBarには、2つの部分に分割されたUISegmentedControlボタンがあります。ファクトリロードとユーザーロード。私はボタンが押され、そのメソッドがUIViewControllerクラスの中にあることを検出するSegmentedControlにアタッチされたアクションメソッドを持っています。私の目標は、アプリのバンドルのplistファイルから構築された新しい辞書の内容でビューをリロードすることです。私は辞書が読み込まれ、表示されるキーがそれぞれのデータフォーマットで設定されていますが、UITableViewをリロードしようとするとクラッシュします。

これは私のアクションメソッド内で動作しようとした最後のコードですが、意図したとおりに機能しません。

- (void) action:(id)sender { 

UISegmentedControl *segment = (UISegmentedControl *) sender; 
if ([segment selectedSegmentIndex] == 1) 
{ 
    NSLog(@"User Load Selected"); 

    NSString *userLoadFilePath = [[NSBundle mainBundle] pathForResource:@"UserLoads" ofType:@"plist"]; 
    NSDictionary *userLoadDictionary = [[NSDictionary alloc] initWithContentsOfFile:userLoadFilePath]; 
    NSArray *allKeys = [userLoadDictionary allKeys]; 
    keys = allKeys; 
    dictionary = userLoadDictionary; 

    [[self tableView] reloadData]; 
} 

else if ([segment selectedSegmentIndex] == 0) 
{ 
    NSLog(@"Factory Load Selected"); 

    NSString *factoryLoadFilePath = [[NSBundle mainBundle] pathForResource:@"AlliantPowder" ofType:@"plist"]; 
    NSDictionary *factoryLoadDictionary = [[NSDictionary alloc] initWithContentsOfFile:factoryLoadFilePath]; 
    NSArray *allKeys = [factoryLoadDictionary allKeys]; 
    keys = allKeys; 

    [[self tableView] reloadData]; 
} 
} 

私はテーブルの再読み込みを取得しようとするのUIViewController内に含まれる実際のテーブルを取得しようとする試みが、運に[[self tableView] reloadData]を呼んでいます。どんな助けもありがたいです。もっとコードが必要な場合は、お尋ねください。ありがとう!

アンドリュー

-------編集----------- ここでは、チップのアイデアを参考に新しいコードがあります。問題は解決されず、アプリはまだクラッシュします。

- (void) action:(id)sender { 

// Create an instance of UISegmentedControl and set it as the sending event. 
UISegmentedControl *segment = (UISegmentedControl *) sender; 

// Detect which button was pressed and load a new dictionary appropriately 
// Checking if userLoads was selected 
if ([segment selectedSegmentIndex] == 1) 
{ 
    NSLog(@"User Load Selected"); 

    keys = userKeys; 
    [[self tableView] reloadData]; 
} 

// Checking if factoryLoads was selected 
else if ([segment selectedSegmentIndex] == 0) 
{ 
    NSLog(@"Factory Load Selected"); 

    keys = [dictionary allKeys]; 
    [[self tableView] reloadData]; 

} 

[segment release]; 
} 
+0

あなたはどこで ' - (void)action:(id)sender {'? –

+0

アクションメソッドの実装は、UISegmentedControllerも作成され、機能するクラスRootViewController.mにあります。このクラスは 'クラスを拡張するUITableViewControllerであり、そのUITableViewを作成するための尊重されたメソッドを持っています。これが '[[self tableView] reloadData]'を呼び出す理由です。私はtableViewを抽出し、新しいキーの配列でそれをリロードすることができると思っています。セルの作成は簡単で、配列の値に基づいてタイトルを設定するだけです。 – Andrew

+0

おそらく、ivarsの代わりにプロパティに割り当てるべきでしょう。 ' - [NSDictionary allKeys]'はおそらくオートレリースされているので、あなたのクラッシュを引き起こします(また、リークもあります)。 –

答えて

0

私は辞書をあらかじめロードし、コントローラークラスのivarsとして保持します。

辞書コンテンツの読み込みが完了していないと賭けているので、クラッシュの原因となっているデータの変更中にreloadDataが呼び出されます。

また、読み込みは高価なオプションであり、segementControlが状態を変更するたびにロードされます。

+0

で試してみるつもりです。ありがとう、私はそのアプローチを試し、アプリが起動したときに私がオリジナルをロードする辞書をロードします。私は私の記憶リークについていくつもりです。私が上記のコメントで述べたように、私は、現時点で最適化されたコードよりも機能的なコードを作ることにもっと焦点を当てています。ありがとう! – Andrew

+0

私はivarsを追加してアプリケーションの早い段階で設定するように提案しているように、コードを再編集して、キーを切り替えて新しいコンテンツを表示できるようにしました。 'NSLog()'を使ってファイルからデータをロードしていることを確認できましたが、 'UITableView'をリロードしようとするとクラッシュします。新しいコードを追加するために投稿を更新しました。 – Andrew

+0

クラッシュにスタックトレースを投稿できますか、クラッシュが発生しているメソッドのコード(つまり、アクションメソッドまたは "cellForIndexPath ..."メソッドにありますか?) –

関連する問題