0

私はかなり困惑しています。アイテムの詳細を保存するためのクラスを持つアプリがあります。と呼ばれる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];
}

それはうまくいきます!

4

2 に答える 2

2

を作成する行がありますが、LogbookFirstViewController実際には何も表示しません (プッシュまたは提示)。これはローカル変数であるため、そのコントローラーのインスタンスがそのビューをロードしているものは、示したコードで初期化したものと同じではないように見えます。

これは、次のような NSLog 行をいくつか追加することで確認できます。

NSLog(@"Setting controller: %@", logController);  // Insert before existing line
[logController setItem:selectedItem];

...と...

[super viewWillAppear:animated];
NSLog(@"Viewing controller: %@", self);  // Insert after existing line

物事が思いどおりに機能するためには、同じ住所を印刷する必要があります。

于 2012-11-27T16:04:38.887 に答える
-1

ARCを使用せずにオブジェクトをプロパティに割り当てる場合は、保持する必要があります。

-(void)setItem:(LEItem *)i{
    _item = [i retain];
    ...
}

ARCでプロパティを使用する場合は、次のように記述します_item = i;

-(void)setItem:(LEItem *)i{
    _item = i;
    ...
}
于 2012-11-27T15:58:10.333 に答える