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