0

辞書の配列を含むplistを使用して、TableView(プロトタイプセル)で選択したセルのTableViewとDetailViewにデータを入力しています。そのためのボタンが押されたときに、選択した辞書をお気に入りタブ(別のTableView)に追加したいと思います。これはこれまでの私のコードです:

これまでのDetailViewControllerのコード:

-(IBAction)FavoriteButton:(id)sender
{
    [[NSNotificationCenter defaultCenter] postNotificationName:@"ItemSelected"
                                                    object:selectedObject];


}

これまでのコードで、FavoritesViewControllerのオブジェクトをキャッチします。

[[NSNotificationCenter defaultCenter] addObserverForName:@"ItemSelected"
                                                  object:nil
                                                   queue:[NSOperationQueue mainQueue]
                                              usingBlock:^(NSNotification* notif) {
                                              [favoritedObjects release];
                                              favoritedObjects = [[notif object] retain];
                                              [self.tableView reloadData];
                                          }];

//And populate the TableView with the objects:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
 {
 return [favoritedObjects count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Favcell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

// Configure the cell...

NSString *cellValue = [favoritedObjects valueForKey:@"Name"];
cell.textlabel.text = cellValue;

return cell;
}

これは、キーの値を持つ20個のセルを示しています:「お気に入りに追加」ボタンを押したDetailViewControllerの最後のオブジェクトの「名前」。たとえば、お気に入りに「Gato Negro」を追加すると、20個のセルに「GatoNegro」が表示されます。次に、favに「Luna」を追加すると、FavoritesViewControllerの20個のセルで「GatoNegro」が「Luna」に置き換えられます。では、お気に入りのTableViewに1つずつ表示するにはどうすればよいですか。

また、アプリを閉じたときに通知センターに変更を保存させて、次回のお気に入りを記憶させるにはどうすればよいですか?

ここのどこかでコミュニケーションの問題のようです。

4

1 に答える 1

0

selectedObjectあなたはオブジェクト(私はあなたの辞書だと思います)で通知を投稿しています。その通知を受け取ると、既存のお気に入りを次のオブジェクトに置き換えます。

favoritedObjects = [[notif object] retain];

したがって、実際には、favoriteObjectsは単一のselectedObjectディクショナリになりました。この辞書にはおそらく20個のエントリがあるため、最終的に20個のセルになります。

コードを機能させるには、(少なくとも)2つの変更を加える必要があります。

  1. 上記の行を変更して、 favoritedObjectsをselectedObjectディクショナリに置き換える代わりに、通知オブジェクトをfavoritedObjects配列に追加NSMutableArrayします(これはであると想定しています) 。また、favoritedObjectsのインスタンスを一度作成する必要があります(最初に何かを追加するときにオンデマンドで、たとえば、それがnilであるかどうかを確認して、新しいNSMutableArrayを作成するか、(atおそらくお気に入りを保存してロードすることになるかもしれないので、永続的なお気に入りの準備がまだできていなくても、その作成を初期化メソッドの1つに入れることはとにかく良い考えです)。favoritedObjects == nilviewDidLoad

  2. 渡されたtableView:cellForRowAtIndexPath:を利用しindexPathて、favoritedObjects配列から実際に正しいエントリを取得します。

また、tableView:cellForRowAtIndexPath:デキューできるセルがない場合は、新しいセルを作成するためのコードがありません。おそらく、ここでの質問のためにこのコードを省略しただけですか?まだの場合は、そのコードを追加する必要があります。

また、メソッド名を小文字で始めることもお勧めします(-(IBAction)favoriteButton:(id)senderの代わりに-(IBAction)FavoriteButton:(id)sender、またはさらに良い:)。-(IBAction)favoriteButtonPressed:(id)senderこれは、Objective-Cメソッドが次のように見えることを誰もが期待しているためです:)

于 2012-07-15T22:03:20.503 に答える