5

カスタム UITableView メニュー セレクター コンポーネントを作成しています。特定の行を選択するたびに、この行のインデックスパスを保存するので、次にユーザーが別の行を選択したときに、以前に選択した行を知ることができます。これを cellForRowAtIndexpath に追加しました

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *cellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];

    cell.textLabel.text = self.left[indexPath.row][@"name"];
    [tableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:[[[NSUserDefaults standardUserDefaults] objectForKey:kPreviousSelectedRow] integerValue] inSection:0] animated:YES scrollPosition:UITableViewScrollPositionNone];
    cell.selectionStyle = UITableViewCellSelectionStyleGray;
    cell.textLabel.highlightedTextColor = [UIColor grayColor];
    return cell;
}

ユーザーが別の行を選択したら、この行を :[[[NSUserDefaults standardUserDefaults] objectForKey:kPreviousSelectedRow] に保存して、次回は以前に選択した行を表示できるようにします。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithInt:indexPath.row] forKey:kPreviousSelectedRow];
}

クラッシュ ログ: インデックスは [[[NSUserDefaults standardUserDefaults] objectForKey:kPreviousSelectedRow] integerValue] で、カウントは numberOfRows です。ご覧のとおり、範囲外であってはなりません。[0...6] がどこから来たのかわかりません。

2013-08-23 21:01:26.107 [17605:c07] index:10, count:14
2013-08-23 21:01:26.173[17605:c07] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 7 beyond bounds [0 .. 6]'

EDITED:テーブルビューをゆっくりスクロールしてもクラッシュしません。速くスクロールするとクラッシュします。何?

4

6 に答える 6

2

この正確な時点で指定されたインデックスを持つセルがないため、クラッシュが発生します。これは、内部で準備しているためです。- (UITableViewCell*)tableView:cellForRowAtIndexPath:

予想される動作を取得するには、移動selectRowAtIndexPath:して、- (UITableViewCell*)tableView:cellForRowAtIndexPath:更新している別のメソッド内に配置しますUITableView:-(void)viewDidLoadまたは-(void)reloadTableたとえば呼び出す場所

于 2013-08-23T12:55:00.567 に答える
0

行数と同じ容量の配列を作成できます。おそらく NO BOOL 値を入力します (実際には [NSnumber numberWithBool:] オブジェクトである必要があるため)。

次に

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

indexPath.row の位置にあるオブジェクトの値を変更します。

そして

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

配列の BOOL 値が YES に設定されているかどうかを確認してから、セルを選択します。(セル選択 = はい)

さらに一歩進んで、カスタム選択スタイルなどでカスタムセルを作成し、選択したデザインを適用するセルにメソッドを作成し、cellForRowAtIndexPath でそのメソッドを呼び出すことができます。

于 2013-08-23T13:08:32.387 に答える
0

ああ、selectRowAtindex を layoutsubview に置き換えるだけで、クラッシュしなくなりました。SVGreg のヒントに感謝します。

于 2013-08-23T13:28:10.333 に答える
0
[tableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:[[[NSUserDefaults standardUserDefaults] objectForKey:kPreviousSelectedRow] integerValue] inSection:0] animated:YES scrollPosition:UITableViewScrollPositionNone];

入ってはいけないcellForRowAtIndexpath

ユーザーがセルを選択するたびにトリガーされるindexPathfromを取得します。didSelectRowAtIndexPathユーザーがセルの選択を解除したとき、または別のセルを選択したときに別のメソッドをトリガーする場合は、

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
于 2013-08-23T12:54:15.173 に答える