私はかなり困惑しています。アイテムの詳細を保存するためのクラスを持つアプリがあります。と呼ばれるLEItem
。これらのアイテムは、 というラベルの付いたクラスのストアに保管されLEItemStore
ます。すべてのアイテムのテーブルを含むビューがあります。これはうまくいきます。行をタップすると、このメッセージが LogbookFirstViewController に送信されます。
LogbookFirstViewController *logController = [[LogbookFirstViewController alloc] initForNewItem:NO];
NSArray *items = [[LEItemStore sharedStore] allItems];
LEItem *selectedItem = [items objectAtIndex:[indexPath row]];
NSString *description = [selectedItem description];
NSLog(@"%@", description);
[logController setItem:selectedItem];
[self dismissViewControllerAnimated:YES completion:nil];
それは TableView クラスにあります。LogbookFirstViewController.m で私が持っている
-(void)setItem:(LEItem *)i{
item = i;
NSString *t = [item description];
NSLog(@"In LogbookFirstViewController, returning %@", t);
}
ここが奇妙になるところです。それはうまくいきます。正しいアイテムを出力するので、すべて問題ないと思います。しかし、そうではありません。item
はクラス レベルのプロパティであるため、そのままにしておく必要がありますが、そうではありません。同じクラスで、このメソッドをオーバーライドしました。
-(void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
//NSString *string = [item description];
//NSLog(@"Item = %@", string);
NSLog(@"View did Appear:animated");
int glucoseValue = [item glucose];
NSString *glucoseString = [NSString stringWithFormat:@"%d", glucoseValue];
[glucoseField setText:glucoseString];
int proteinValue = [item protein];
NSString *proteinString = [NSString stringWithFormat:@"%d", proteinValue];
[proteinField setText:proteinString];
int carbsValuue = [item carbs];
NSString *carbsString = [NSString stringWithFormat:@"%d", carbsValuue];
[carbsField setText:carbsString];
int insulinValue1 = [item insulin];
NSString *insulin1String = [NSString stringWithFormat:@"%d", insulinValue1];
[insulinField1 setText:insulin1String];
int insulinValue2 = [item insulin2];
NSString *insulinString2 = [NSString stringWithFormat:@"%d", insulinValue2];
[insulinField2 setText:insulinString2];
//NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init];
//[dateFormatter setDateStyle:NSDateFormatterShortStyle];
//[dateFormatter setTimeStyle:NSDateFormatterShortStyle];
//NSLog(@" The item was created on %@", [dateFormatter stringFromDate:[item dateCreated]]);
//[dateButton setTitle:[dateFormatter stringFromDate:[item dateCreated]] forState:UIControlStateNormal];
NSString *t = [item description];
NSLog(@"Loading view... Returns: %@", t);
}
これが最もクリーンなコードではないことはわかっていますが、考え方は同じです。setItem: メソッドとまったく同じコードを使用します。ただし、これは常に (null) を返します。なんで?プロパティは、viewWillAppear で行方不明になっているように見えます。
ありがとう。
編集
問題を解決しました。ご覧のとおり、以下のチェックされた回答は正しいアイデアを与えてくれました。これを解決するために私がしたことは次のとおりです。問題は、setItem を送信したときに、このコードを使用して LogbookFirstViewController を取得したことです。
LogbookFirstViewController *logController = [[LogbookFirstViewController alloc] initForNewItem:NO];
私が知っているように、これは LogbookFirstViewController の新しいインスタンスを作成したため、プロパティが 1 つのインスタンスに割り当てられているため、既存のインスタンスは Item プロパティを変更しませんでした。したがって、この「見えない」プロパティの Item の値のみを変更していました。
これを解決するには、viewController の既存のインスタンスを取得する必要があります。これを行うために、次のことを行いました。
LogbookFirstViewController.h で、このプロパティを追加しました
@property (assign) LogbookFirstViewController *instance;
次に、インスタンスを.mに合成し、同じ場所にこれをviewDidLoadに追加しました
- (void)viewDidLoad
{
instance = self;
...
次に、他のviewController、entriesViewControllerで、これも.hに追加しました
@property (nonatomic, strong) LogbookFirstViewController *logController;
それを合成します。次に、既存の logController を使用して、同じ方法で didSelectRowAtIndexPath を使用しました
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
NSArray *items = [[LEItemStore sharedStore] allItems];
LEItem *selectedItem = [items objectAtIndex:[indexPath row]];
NSString *description = [selectedItem description];
NSLog(@"%@", description);
NSLog(@"Setting controller: %@", logController);
[logController setItem:selectedItem];
[self dismissViewControllerAnimated:YES completion:nil];
}
それはうまくいきます!