1

关于另一个问题,我尝试了一些方法来将一个 tableView 中的一个单元格添加到一个新的单元格中。首先,我有一张小图片,它显示了这个过程应该如何工作。 在此处输入图像描述CarsViewController包含一系列汽车。当您点击一个单元格时,一个新视图 ( CarDetailViewController) 会显示每辆车的详细信息并favoriteButton打开。通过点击此按钮,tableView ( ) 中的这辆车的单元格CarsViewController应添加到新的 tableView ( FAVViewController) 中,如图所示。

我已经尝试过一些东西,但没有奏效。Car班级:

#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];
}

带有它的CarDetailViewController按钮:

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

        [favoritesArray addObject:car];

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

        }

最后是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;
}

更新

我已经尝试过从 tableView 中删除一个单元格,但是在重新加载视图后,所有单元格都消失了。

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

和...

- (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

而不是将汽车添加到 CarDetailViewController 的收藏夹数组中,您必须将它添加到 FAVViewController 的数组中。然后你在它的 tableView 上调用 reloadData。

您需要将数组属性移动到接口而不是实现,或者更好地创建一个可以为您完成这两项工作的方法。

于 2013-07-25T13:08:03.130 回答
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"];

并在收藏夹视图控制器中检索数组

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

}

这使您的自定义对象符合 NSCoding,因此您可以使用 NSUserDefaults。

于 2013-07-25T13:23:29.727 回答
0

使用 SharedManager 文件来完成您的要求。
我的经理.h 我的经理
.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 回答