0

私はiOSコーディングが初めてです.SOでここを見回し、これを解決するためにいくつかのアプローチを試みましたが、何もうまくいかないようです. 私はそれが私の愚かな間違いのせいだと確信しています:-)

合計で約25行のセクションテーブルがあり、2つのセクションに分かれています。それぞれcell.accessoryViewにスイッチがあります。スイッチの状態が変化したときに、スイッチの状態を に保存しようとしますが、NSArrayそのインデックスで配列の内容をログに記録すると、どのような場合でも奇妙に返さ0れます。(配列は のプロパティとしてインスタンス化され、(nonatomic, readwrite)合成TableViewControllerされます)

そして明らかに、テーブルを上下にスクロールすると、すべてのスイッチがデフォルトOFFの状態に戻ります。

助けてくれてありがとう!

- (void)viewDidLoad
{
[super viewDidLoad];
//countries dict and switch state array init..  
self.countries = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"countries" ofType:@"plist"]];
NSNumber *b = [NSNumber numberWithBool:NO];
for (int i=0; i<210; i++) {
    [statiSwitch addObject:b];
    NSLog(@"%d", [[statiSwitch objectAtIndex:i] integerValue]);
}

//tableview drawing..
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"CellWithSwitch";    
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}

NSString *continent = [self tableView:tableView titleForHeaderInSection:indexPath.section];
NSString *country = [[self.countries valueForKey:continent] objectAtIndex:indexPath.row];

//Simple tag calculation...
NSInteger tagOb = indexPath.section * 100 + indexPath.row;

UISwitch *mySwitch = [[UISwitch alloc] initWithFrame:CGRectZero];
[mySwitch addTarget:self action:@selector(switchChange:) forControlEvents:UIControlEventValueChanged];
mySwitch.tag = tagOb;
if ([statiSwitch count] > tagOb) {
    [mySwitch setOn:[[statiSwitch objectAtIndex:tagOb] boolValue] animated:NO];
     }

cell.textLabel.text = country;    
cell.accessoryView = mySwitch;

return cell;
}

そして、スイッチのステータス変更時に呼び出されるメソッド:

- (void) switchChange:(UISwitch *)sender {
NSNumber *c = [NSNumber numberWithBool:sender.on];
[statiSwitch replaceObjectAtIndex:sender.tag withObject:c];

NSLog(@"switch tag is: %i and state is: %d", sender.tag, sender.on);
NSLog(@"switch states array value: %d", [[statiSwitch objectAtIndex:sender.tag] integerValue]);
}
4

3 に答える 3

0

スイッチの値を保存するために単純なものを使用しました。これは、以前行っていた switchTag および switchState プロパティを持つオブジェクトで構成されたものint arrayよりもうまく機能するようです。NSMutableArray

コードは次のとおりです。

- (void)viewDidLoad
{   
    //[here goes the code to retrieve my table data from a dictionary, getting sections and rows]

    //int array iniazialization, with zeros to have switches set at OFF at beginning

    for (int i = 0; i < 300; i++) {
    switchStates[i] = 0;
        }
}

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

    static NSString *CellIdentifier = @"Cella"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}

//Cell drawing..

NSString *continent = [self tableView:tableView titleForHeaderInSection:indexPath.section];
NSString *country = [[self.countries valueForKey:continent] objectAtIndex:indexPath.row];
cell.textLabel.text = country;

//Calculate the tag to be assigned to the switches..

    switchTag = indexPath.section * 100 + indexPath.row
    UISwitch *mySwitch = [[UISwitch alloc] initWithFrame:CGRectZero];
    [mySwitch addTarget:self action:@selector(switchChange:) forControlEvents:UIControlEventValueChanged];
    mySwitch.tag = switchTag;
    mySwitch.on = switchStates[switchTag];

    cell.accessoryView = mySwitch;

    return cell;

}

//switch change action..

- (void) switchChange:(UISwitch *)sender {
     switchStates[sender.tag] = sender.on;
}

今、私はこれらのスイッチ値をコアデータに保存するだけです..今後の質問については、ここでお会いしましょう:-)

于 2013-07-20T14:59:16.490 に答える
0
  1. カスタム セル クラスを設定します。
  2. ストーリーボードにプロトタイプ セルを作成し、その中にスイッチを配置します。
  3. プロトタイプ セルをカスタム クラスに設定し、再利用識別子を設定します。
  4. カスタム セル クラスの IBOutlet にスイッチを接続します。(セルが通信できるようにする場合は、@protocol とデリゲートも設定します)
  5. トリッキー/ハックな部分は次のとおりです。

-viewDidLoad:

    for (int i = 0; i < [self.cellDataArray count]; ++i) {
            CustomCell *cell;

    cell = [self.tableView dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:nil];
    cell.delegate = self;
    [self.cellsArray addObject:cell];
}
  1. cellForRowAtIndexPath で、次の操作を行います。

    cell = self.cellsArray[indexPath.row]; // または collectionView を使用する場合は .item

  2. スイッチは各セルに接続されているため、CustomCell クラスには、スイッチに基づいて何かを実行し、おそらくデリゲート クラスに呼び出しを送信するメソッドが必要です。

于 2013-07-19T19:00:36.327 に答える