0

アプリケーションにJSON呼び出しが入力されたエンティティ/クラスがあります。この呼び出しが行われると、このエンティティを反復処理しても頻繁に変更されない値をアプリケーションデリゲートに設定します。これらはすべてうまく機能し、バックストーリーを提供するだけです。ユーザーがテーブルビューでアイテムをクリックしたら、falseの場合は0、trueの場合は1に割り当てた文字列値を取得し、それを次のように使用します。詳細画面のテーブルビューで選択された値のインデックス。それぞれのセルに「いいえ」と「はい」が表示されます。基本的に、現在の設定をユーザーに表示しようとしています。ユーザーがそれを変更したい場合は、ユーザーが選択を変更して、エンティティの更新とともに前のページのテーブルビューに保存できるようにします。

私が抱えている問題は、詳細画面のテーブルビューが、選択されたインデックスだけでなく、両方の行を選択していないことです。最初にこれだけを修正する必要があります。

cellForRowAtIndexPath-正しく機能しているようです...

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

UITableViewCell *result = nil;

static NSString *CellIdentifier = @"CellIdentifier";

result = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

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

AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];

Settings *settings = (Settings *)[appDelegate.settings objectAtIndex:indexPath.row];

// Save the value the user clicked on for use in updating the MasterViewController and the data model
result.textLabel.text = settings.name;

NSLog(@"result.textLabel.text: %@", result.textLabel.text);

return result;
}

これは物事が醜くなるところです!

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {

AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];

NSLog(@"appDelegate.selectedValueInSettingsCheckedIndexValue: %i", (int)appDelegate.selectedValueInSettingsCheckedIndexValue);

NSLog(@"appDelegate.frozen_quantity_value: %@", appDelegate.frozen_quantity_value == @"No" ? @"0" : @"1");

if(appDelegate.selected_category == FROZEN && appDelegate.selected_setting == QUANTITY && [appDelegate.frozen_quantity_value isEqualToString:ZERO]) {

    NSLog(@"Reached frozen quantity with value of: %@", appDelegate.frozen_quantity_value == @"No" ? @"0" : @"1");
    NSLog(@"indexPath.row: %i", indexPath.row);

    if ((int)appDelegate.frozen_quantity_value == (int)appDelegate.selectedValueInSettingsCheckedIndexValue)/*(int)[appDelegate.frozen_quantity_value isEqualToString:@"No"] ? @"0" : @"1")*/ {
            [cell setSelected:NO animated:YES];
            [self performSelector:@selector(unselectCellAtIndexPath:) withObject:indexPath];
            cell.accessoryType = UITableViewCellAccessoryCheckmark;
        } else {
            [cell setSelected:NO];
            cell.accessoryType = UITableViewCellAccessoryNone;
        }
} else if (appDelegate.selected_category == FROZEN && appDelegate.selected_setting == FACINGS) {

    NSLog(@"Reached vegetables facings with value of: %@", appDelegate.vegetables_facing_value == @"No" ? @"0" : @"1");
    NSLog(@"indexPath.row: %i", indexPath.row);
}
}

より更新されたコード...

-(void)unselectCellAtIndexPath:(NSIndexPath *)indexPath{

[self.tableView deselectRowAtIndexPath:indexPath animated:YES];
}

私はこれが恐ろしい混乱であることに気づきます...私はただいくつかの方向性が必要です。

メイン画面と詳細画面のUIは次のようになります...

主要 詳細...両方の項目がチェックされていることに注意してください...

4

2 に答える 2

1

私はあなたがやろうとしていると思うことをするために次のテストプロジェクトを作りましたが、私が思うに自分のデザインを使用すると、物事が少し単純化され、うまくいくようです。デザインは次のとおりです。

1)Appleは、アプリデリゲートのようなシングルトンからテーブルビューのデータを取得することを推奨していません。そのため、そのクラスで行うのは、ウィンドウのルートビューコントローラーを設定することだけです。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    TableController *tc = [[TableController alloc]initWithNibName:@"TableController" bundle:nil];
    tc.title = @"Main Table";
    UINavigationController *nav = [[UINavigationController alloc]initWithRootViewController:tc];
    self.window.rootViewController = nav;
    [self.window makeKeyAndVisible];
    return YES;
}

2)ダウンロード、JSONの解析、Settingオブジェクトの作成、およびそれらを保持する配列を実行するクラスDownloadFromServerを作成しました。次に、データの配列を含む通知を投稿します。現在のところ、このクラスは、サーバーにアクセスできないため、データをシミュレートするだけです。テーブルビューコントローラからダウンロード(シミュレーション)を開始するメソッドを呼び出します。

-(void) connectionDidFinishLoading { //:(NSURLConnection *)connection {
    self.settings = [NSMutableArray array];
    //NSError *error = nil;
    //id result = [NSJSONSerialization JSONObjectWithData:self.receivedData options:kNilOptions error:&error];

    //Simulated data here 
    NSMutableArray *result = [NSMutableArray array];
    [result addObject:[NSMutableDictionary dictionaryWithObjectsAndKeys:@2377,@"CatalogID",@"Frozen",@"Category",@"0",@"Facings",@"25",@"ID",@"0",@"Quantity", nil]];
    [result addObject:[NSMutableDictionary dictionaryWithObjectsAndKeys:@2377,@"CatalogID",@"Fruit",@"Category",@"0",@"Facings",@"19",@"ID",@"0",@"Quantity", nil]];
    [result addObject:[NSMutableDictionary dictionaryWithObjectsAndKeys:@2377,@"CatalogID",@"Salads",@"Category",@"1",@"Facings",@"12",@"ID",@"1",@"Quantity", nil]];
    [result addObject:[NSMutableDictionary dictionaryWithObjectsAndKeys:@2377,@"CatalogID",@"Vegetables",@"Category",@"1",@"Facings",@"26",@"ID",@"0",@"Quantity", nil]];

    if ([result isKindOfClass:[NSArray class]]) {

        for (NSDictionary *item in result) {

            NSString *settingsID = [item objectForKey:@"ID"];
            NSString *category = [item objectForKey:@"Category"];
            NSString *categoryID = [item objectForKey:@"CatalogID"];
            NSString *facings = [item objectForKey:@"Facings"];
            NSString *quantity = [item objectForKey:@"Quantity"];

            Setting *setting = [[Setting alloc] initWithName:settingsID desc:category CategoryID:categoryID Facings:facings Quantity:quantity];

            [self.settings addObject:setting]; 
        } 
    }
    [[NSNotificationCenter defaultCenter] postNotificationName:@"UpdateReceived" object:self userInfo:@{@"array" : self.settings}];
}

3)Table View Controllerはダウンロードを開始し、通知で送信されたデータからローカル配列にデータを入力します。tableView:didSelectRowAtIndexPath:メソッドで、詳細テーブルが選択を変更するための最良の方法は、設定オブジェクトと選択した行のindexPathを渡すことであると判断しました。これにより、DetailViewControllerに変更に必要なすべての情報が提供されます。データ。

- (void)viewDidLoad {
    [super viewDidLoad];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateArray:) name:@"UpdateReceived" object:nil];
    DownloadFromServer *downloader = [[DownloadFromServer alloc]init];
    [downloader connectionDidFinishLoading];

}

-(void)viewDidAppear:(BOOL)animated {
    [self.tableView reloadData];
}

-(void)updateArray:(NSNotification *) aNote {
    self.theData = [aNote.userInfo valueForKey:@"array"];
    [self.tableView reloadData];
}


- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return self.theData.count;
}

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
    return [[self.theData objectAtIndex:section] category];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return 2;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier];
        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    }

    if (indexPath.row ==0) {
        cell.textLabel.text = @"Facings";
        cell.detailTextLabel.text = [[NSString stringWithFormat:@"%@",[[self.theData objectAtIndex:indexPath.section] facings]] intValue] ? @"YES" : @"NO";
    }else{
        cell.textLabel.text = @"Quantity";
        cell.detailTextLabel.text = [[NSString stringWithFormat:@"%@",[[self.theData objectAtIndex:indexPath.section] quantity]] intValue] ? @"YES" : @"NO";
    }
    return cell;
}


- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    DetailViewController *detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];
    detailViewController.selectedIndexPath = indexPath;
    detailViewController.settingObject = [self.theData objectAtIndex:indexPath.section];
    [self.navigationController pushViewController:detailViewController animated:YES];
}

DetailViewControllerでは、ユーザーがテーブル内の行を選択してNO / YES値を編集できるようにしました。選択された行と、メインテーブルで選択された行に基づいて、ロジックが値を更新して再読み込みします。テーブル。戻るボタンを押すと、メインテーブルもviewDidAppearメソッドを介して更新されます。

#import "DetailViewController.h"
#import "Setting.h"

@implementation DetailViewController

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return 2;
}

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
    switch (self.selectedIndexPath.row) {
        case 0:
            return [NSString stringWithFormat:@"%@ - Facings", self.settingObject.category];
            break;
        case 1:
            return [NSString stringWithFormat:@"%@ - Quantity", self.settingObject.category];
            break;
        default:
            return @"";
            break;
    }
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"DetailCell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil)
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

    int isYes = (self.selectedIndexPath.row ?  self.settingObject.quantity.intValue : self.settingObject.facings.intValue);
    if (indexPath.row ==0) {
        cell.textLabel.text = @"NO";
        cell.accessoryType = (isYes) ? UITableViewCellAccessoryNone : UITableViewCellAccessoryCheckmark;
    }else{
        cell.textLabel.text = @"YES";
        cell.accessoryType = (isYes) ? UITableViewCellAccessoryCheckmark : UITableViewCellAccessoryNone;
    }
    return cell;
}

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    int test = indexPath.row + (2 * self.selectedIndexPath.row);
    switch (test) {
        case 0:
            self.settingObject.facings = @"0";
            break;
        case 1:
            self.settingObject.facings = @"1";
            break;
        case 2:
            self.settingObject.quantity = @"0";
            break;
        case 3:
            self.settingObject.quantity = @"1";
            break;
        default:
            break;
    }
    [self.tableView reloadData];
}
于 2012-10-14T04:42:51.473 に答える
0

何をしているのかわかりにくいですが、この行は次のとおりです。

if ((int)indexPath.row == (int)[appDelegate.frozen_quantity_value isEqualToString:@"No"] ? @"0" : @"1")

三項演算子は「0」または「1」の文字列を返すため、常に「true」と評価されますが、文字列は有効なオブジェクトであるため、true と評価されます。これはあなたの問題ではないかもしれませんが、そのコードで何をしようとしているのか、私には本当にわかりません。たとえば、unselectCellAtIndexPath:withObject:? そのためのコードは表示しません。

于 2012-10-12T16:46:18.277 に答える