2012-03-20 9 views
8

Appleのカレンダーアプリケーションの開始時間と終了時間の設定と同様のビューを実装しようとしています。私は素晴らしい見通しを持っているが、私は2つの問題に遭遇している。まず、最初の行を自動的に選択したい。ビューがロードされたときにreloadDataを使用してUITableViewを更新すると選択を維持する

NSIndexPath *indexPath=[NSIndexPath indexPathForRow:0 inSection:0]; 
[dateTableView selectRowAtIndexPath:indexPath animated:YES scrollPosition:UITableViewScrollPositionBottom]; 

しかし、視覚的にrownを選択するアニメーションのショーが、私はそれはすでにときのビューのロードを選択することにしたい:私は一種のこの作業使用しています。

2番目の重要な問題は、ピッカーが更新された後にデータをリロードすると選択が失われ、自分のタスクが機能しないということです。

私はこれがreloadDataのデフォルトのアクションであることを知っています。私は目標を達成するための代替メソッドを探していますか、reloadDataをどのようにして現在の選択を解除しないかを考えています。

私の仕事は、以下が含まれる:

-(IBAction)dateChanged 
{ 

    NSIndexPath *index = self.dateTableView.indexPathForSelectedRow; 
    if(index == 0) 
    { 
     if (self.date2 == plusOne) { 
      self.date = [datePicker date]; 
      plusOne = [self.date dateByAddingTimeInterval:60*60]; 
      self.date2 = plusOne; 
     } 
     else 
     { 
      self.date = [datePicker date]; 
     } 

    } 
    else{ 
     self.date2 = [datePicker date]; 
    } 

    [dateTableView reloadData]; 
} 

注:プラスワンは、最初に、現在の時刻からの時間を示す変数です。

ありがとうございます!

+0

どのような方法で最初のコードブロックを呼び出すのですか? – MishieMoo

答えて

13

最初の問題については、メソッド呼び出しでanimated:NOを設定します。あなたは現在、それをYESに設定しています。第二の問題については

[dateTableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionBottom]; 

、それはあなたがデータをリロードした後、選択しようとしているものを実際に明確ではないのですが、私はこのラインでの問題を参照してください。

if(index == 0) 

ポインタがにあればあなたが求めていますオブジェクトは0です。あなたが望むものは、index == nilかそれともindex.section == 0 && index.row == 0なのかをチェックすることです。

とにかく、UITableViewでreloadDataを呼び出すと、選択を失うことになります。その時点で、新しい行を選択する必要があります。データモデルにアイテムを選択したい場合は、そのアイテムがどこにあるかを判断する必要があります(UITableViewDataSourceデリゲートでその情報を提供しているので、これを知っておく必要があります)。メソッド)。または、dateChangedの最初の行に保存したNSIndexPathを選択する場合は、データをリロードした後に選択するだけです。

+0

ありがとう!私はそれを逃したと信じられない! – Jerome

+0

素晴らしいですが、あなたが言ったことに基づいてそれを動作させることができました。 index.rowを追加し、アニメーションなしでreloadDataの後で再選択しました。ありがとう、トンの男、あなたがロック! – Jerome

+0

@BrianCooley datatableviewの行を書く場所はどこですか? – Muju

1

最初の問題については、コードをdidSelectRowAtIndexPath:メソッドに記述してください。その後、didSelectRowAtIndexPathからこのメソッドを呼び出すことができます:あなたが好きなあなたの関数の引数としてindexPathを渡す必要があり、

-(void)doActionsInDidSelectRow:(NSIndexPath*)indexPath{ 
    // write code. 
} 

のviewDidLoadでは、私の提案は第二の問題について

-(void)viewDidLoad{ 

     NSIndexPath *indexPath=[NSIndexPath indexPathForRow:0 inSection:0]; 
     [dateTableView selectRowAtIndexPath:indexPath animated:YES scrollPosition:UITableViewScrollPositionBottom]; 
     [self doActionsInDidSelectRow:indexPath]; 
} 

としてたびに、このメソッドを呼び出しますセルを選択すると、そのセルのテキストがNSString内に格納されます。データをリロードするときは、cellForRowAtIndexPathの中で:セルのテキストと以前に格納した文字列の内容を比較するだけです。それらが等しい場合は、

[dateTableView selectRowAtIndexPath:indexPath animated:YES scrollPosition:UITableViewScrollPositionBottom]; 

の方法を使用して選択するだけです。これがあなたの問題を解決することを願っています。

関連する問題