Проблема при удалении данных из основных данных через табличное представление iPhone - PullRequest
0 голосов
/ 30 января 2012

В cellForRowAtIndexPath: методе я реализовал распознаватель жестов для длительного нажатия,

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

if (tableView == favouritesTable) {
    cellValue = [licensePlateArray objectAtIndex:indexPath.row];
} else { // handle search results table view
    cellValue = [filteredListItems objectAtIndex:indexPath.row];
}

static NSString *CellIdentifier = @"vlCell";

VehicleListCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil) {

    NSLog(@"Cell Created");

    NSArray *nibObjects = [[NSBundle mainBundle] loadNibNamed:@"VehicleListCell" owner:nil options:nil];

    for (id currentObject in nibObjects) {
        if ([currentObject isKindOfClass:[VehicleListCell class]]) {
            cell = (VehicleListCell *)currentObject;
        }
    }

}

UILongPressGestureRecognizer *pressRecongnizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(tableCellPressed:)];

toDeleteObject = [results objectAtIndex:indexPath.row];
pressRecongnizer.view.tag = indexPath.row;

pressRecongnizer.minimumPressDuration = 0.5f;
[cell addGestureRecognizer:pressRecongnizer];
[pressRecongnizer release];

cell.textLabel.font = [UIFont systemFontOfSize:10];

Favouritesdata *favdata = [results objectAtIndex:indexPath.row];

[[cell ignition] setImage:[UIImage imageNamed:@"ignition.png"]];
[[cell direction] setImage:[UIImage imageNamed:@"south.png"]];

cell.licPlate.text = [favdata licenseplate];

NSLog(@"cellvalue for cellforRow: %@", cell.licPlate.text);

return cell;}

И в tableCellPressed

- (void)tableCellPressed:(UILongPressGestureRecognizer *)recognizer{
if (recognizer.state != UIGestureRecognizerStateBegan) {
    return;
}

VehicleListCell* cell = (VehicleListCell *)[recognizer view];

cellValueForLongPress = cell.licPlate.text;

NSLog(@"cell value: %@", cellValueForLongPress);

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil message:nil delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles: nil] ;

alert.tag = recognizer.view.tag;

[alert addButtonWithTitle:@"Remove from Favourites"];
[alert addButtonWithTitle:@"Show on Map"];

[alert show];}

И в alertView:

-(void)alertView:(UIAlertView *)alert clickedButtonAtIndex:(NSInteger)buttonIndex {
NSString *title = [alert buttonTitleAtIndex:buttonIndex];

if([title isEqualToString:@"Remove from Favourites"])
{
    NSLog(@"cellValueForLongPress: %@", cellValueForLongPress);

    [results removeObjectAtIndex:alert.tag];

    [context deleteObject:toDeleteObject];

    NSLog(@"alert.tag:::: %d", alert.tag);   

}
else if([title isEqualToString:@"Show on Map"])
{
    NSLog(@"Go to MapView");

    Maps *detailViewFromLabel = [Maps alloc];

    [self.view addSubview:detailViewFromLabel.view];

}

NSError *error;

if (![context save:&error]) {
    NSLog(@"Error Occured");
}

[favouritesTable reloadData];}

Через этот код запись из основных данных удаляется, но проблема в том, что она удаляет только запись с индексом: 0, а не запись, выбранную из таблицы.

Как я могу решить эту проблемувопрос?

Ответы [ 2 ]

0 голосов
/ 30 января 2012

Вы все равно делаете это задом наперед, но вот ваша проблема:

pressRecongnizer.view.tag = indexPath.row; // view is nil at this point 
pressRecongnizer.minimumPressDuration = 0.5f; 
[cell addGestureRecognizer:pressRecongnizer]; // now we have a view!
[pressRecongnizer release];

Вы устанавливаете тег в представлении pressRecogniser, прежде чем настраивать само представление. Таким образом, вы устанавливаете тег в ничто, заканчивая нулем в качестве тега, и это строка, которую вы продолжаете удалять.

Добавьте распознаватель жестов в свою ячейку при его первом создании (если ячейка == nil), затем в вашем методе действия получите индексный путь к ячейке (для этого у UITableView есть метод, indexPathForCell:), и используйте это, чтобы определить, какой элемент вы выбрали и какой элемент должен быть удален.

0 голосов
/ 30 января 2012

Как насчет того, чтобы ваш подкласс uitableviewcell реализовал распознаватель жестов, и он также может содержать ссылку на ваш объект данных.Это было бы намного лучше.

Предполагая, что ваш контроллер представления хранит вашу модель данных (на самом деле плохая идея), вы могли бы затем связаться с помощью либо делегата, либо шаблона уведомления.

Вот кое-чтос макушки головы

@interface VehicleListCell 
@property (nonatomic, retain) VehicleClass *vehicle;
@end

@implementation VehicleListCell

@synthesize vehicle;

- (id) initWithStyle:(UITableViewCellStyle) style reuseIdentifier:(NSString*)identifier {
    self = [super initWithStyle:style reuseIdentifier:identifier];
    if (self) {
       //add your gesture recogniser to self using the same code you have
    }
    return self;
}

- (void)tableCellPressed:(UILongPressGestureRecognizer *)recognizer{
if (recognizer.state != UIGestureRecognizerStateBegan) {
    return;
}
[NSNotificationCenter postNotificationName: @"VehicleDeleted" withObject: self userInfo: [NSDictionary dictionaryWithObject: vehicle andKey: @"vehicle"]]
}
@end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...