1

in relation to a other question, I tried a few things to add a cell from one tableView to a new one. First of all I have a little picture which shows how this process should work. enter image description here There is the CarsViewController containing an array of cars. When you tap on one cell a new view (CarDetailViewController) which shows the details of each car and has got a favoriteButton opens. By tapping on this Button the cell of this car from the tableView (CarsViewController) should be added to a new tableView (FAVViewController) as you can see in the picture.

I've already tried something but it didn't work. The Car class:

#import "Car.h"
@implementation Car
@synthesize name;
@synthesize speed;

@end

CarsViewController:

@implementation CarsViewController {
    NSArray *cars;
}

@synthesize tableView = _tableView;

- (void)viewDidLoad
{
    Car *car1 = [Car new];
    car1.name = @"A1";
    car1.speed = @"200 km/h";

  Car *car2 = [Car new];
    car2.name = @"A2";
    car2.speed = @"220 km/h";

cars = [NSArray arrayWithObjects:car1, car2, nil];
}

The CarDetailViewController with its button:

    @implementation CarDetailViewController{
        NSMutableArray *favoritesArray;
    }
...
    - (IBAction)setFAV:(id)sender {

        [favoritesArray addObject:car];

        [[NSUserDefaults standardUserDefaults] setObject:favoritesArray forKey:@"favoriteCars"];

        }

And finally the FAVViewController:

@implementation FAVViewController{

    NSMutableArray *array;
}
- (void)viewDidLoad
{
    [super viewDidLoad];
    array = [NSMutableArray arrayWithArray:[[NSUserDefaults standardUserDefaults] objectForKey:@"favoriteCars"]];


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

    }

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *simpleTableIdentifier = @"Cell2";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];

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

    Car *cars2 = [array objectAtIndex:indexPath.row];
    UILabel *CarNameLabel = (UILabel *)[cell viewWithTag:100];
    CarNameLabel = cars2.name;

    return cell;
}

UPDATE

I`ve tried something to remove one cell from the tableView but after reloading the view all cells are away.

-(void)remove{
    [favoritesArray removeObject:car];
    [[NSUserDefaults standardUserDefaults] setObject:[NSKeyedArchiver archivedDataWithRootObject:favoritesArray] forKey:@"favoriteCars"];
} //in CarDetailView

and...

- (void)tableView:(UITableView *)table commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{

    if (editingStyle == UITableViewCellEditingStyleDelete)
    {

        CarDetailViewController *instance = [[CarDetailViewController alloc] init];
        [instance remove];


        [array removeObjectAtIndex:indexPath.row];
        [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];

    }
}
4

3 に答える 3

0

要件を満たすには、SharedManager ファイルを使用します。
MyManager.h
MyManager.m

viewdidload で共有マネージャーのインスタンスを次のように作成します。

_sharemanager=[MyManager sharedManager];

detailViewController に移動しながら、選択したオブジェクトを sharedManager オブジェクトに次のように設定します

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
        DetailViewController *detailVC=[[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];
        [_sharemanager setCarDictionary:[carsArray objectAtIndex:indexPath.row]];
        [self.navigationController pushViewController:detailVC animated:YES];
}

DetailViewController の viewDidLoad メソッドで、sharedManager インスタンスを作成し、選択したオブジェクト値を取得し、定義されている場合はラベルに設定します。

- (void)viewDidLoad
{
    _shareManager=[MyManager sharedManager];

    carName.text=[[_shareManager carDictionary] valueForKey:@"name"];
    speed.text=[[_shareManager carDictionary] valueForKey:@"speed"];

    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
}

お気に入りボタンをクリックすると、sharedInstance の現在のオブジェクトが、sharedManager ファイルで定義されているお気に入りの配列に設定されます。

-(IBAction)setMyFavorite:(id)sender
{
    NSMutableArray *favArray=[_shareManager favCarsArray];

    if ([favArray indexOfObject:[_shareManager carDictionary]] == NSNotFound) {
        [favArray addObject:[_shareManager carDictionary]];
        [_shareManager setFavCarsArray:favArray];
    }
}

同様に、最後に FavoriteViewController で sharedManager インスタンスを作成し、お気に入りの配列リストを取得して、お気に入りのテーブルを次のようにリロードします。

favoriteCarList=[_sharemanager favCarsArray];
[favTable reloadData];

サンプルのダウンロードはこちら

于 2013-07-25T15:44:09.607 に答える
0

これをあなたのCar.m

- (void)encodeWithCoder:(NSCoder *)coder;
{
    [coder encodeObject:name forKey:@"name"];
    [coder encodeObject:speed forKey:@"speed"];
}

- (id)initWithCoder:(NSCoder *)coder;
{
    self = [[Car alloc] init];
    if (self != nil)
    {
        name = [coder decodeObjectForKey:@"name"];
        speed = [coder decodeObjectForKey:@"speed"];
    }   
    return self;
}

配列setFavを格納するメソッド内

NSData *dataForArray = [[NSUserDefaults standardUserDefaults] objectForKey:@"favoriteCars"];
if (dataForArray != nil)
{
    favoritesArray = [NSMutableArray arrayWithArray:[NSKeyedUnarchiver unarchiveObjectWithData:dataForArray]];

}

[favoritesArray addObject:Car];
[[NSUserDefaults standardUserDefaults] setObject:[NSKeyedArchiver archivedDataWithRootObject:favoritesArray] forKey:@"favoritesCars"];

そして、お気に入りのView Controllerで配列を取得するには

NSData *dataForArray = [[NSUserDefaults standardUserDefaults] objectForKey:@"favoriteCars"];
if (dataForArray != nil)
{
    array = [NSMutableArray arrayWithArray:[NSKeyedUnarchiver unarchiveObjectWithData:dataForArray]];

}

これにより、カスタム オブジェクトが NSCoding に準拠するようになり、NSUserDefaults を使用できるようになります。

于 2013-07-25T13:23:29.727 に答える
0

車を CarDetailViewController の favoritesArray に追加するのではなく、FAVViewController の配列に追加する必要があります。次に、その tableView で reloadData を呼び出します。

配列プロパティを実装ではなくインターフェイスに移動するか、これらの両方を実行できるメソッドを作成する必要があります。

于 2013-07-25T13:08:03.130 に答える