как сохранить состояние в userdefaults аксессуара галочка-iphone - PullRequest
2 голосов
/ 08 апреля 2011

Я работаю над приложением, имеющим UItableView.В строках таблицы я могу поставить галочки. Теперь, как сохранить состояние галочек, чтобы, даже если пользователь закрыл приложение, состояние было сбрито, и при следующем запуске приложения должна отображаться галочка.Я следовал инструкциям на NSUSerDefaults, но, потянув за волосы, куда ставить коды сохранения и извлечения. Я пытался, но каждый раз ошибки забивают меня и не могут исправить.Мой код:

Файл MY.h

**@protocol LocationSelectionViewControllerDelegate <NSObject>

@required
- (void)rowSelected:(NSString *)selectedValue selectedIndex:(NSInteger)index;
@end**

@interface LocationSelection : UIViewController <UITableViewDelegate,UITableViewDataSource>{

UITableView *table;
***NSInteger       selectedIndex;***
NSMutableArray *menuList;
***id <LocationSelectionViewControllerDelegate>    delegate;***

}
@property (nonatomic,retain) NSMutableArray *menuList;  
@property (nonatomic,retain) IBOutlet UITableView *table;  
***@property (nonatomic, assign) id <LocationSelectionViewControllerDelegate> delegate;**  
**@property NSInteger selectedIndex;***  
@end  

Мой файл .m:

@implementation LocationSelection  
***@synthesize menuList, table,selectedIndex,delegate;***

- (void)viewDidLoad
{
    menuList = [[NSMutableArray alloc] initWithObjects:
                [NSArray arrayWithObjects:@"LOCATION1", nil],
                [NSArray arrayWithObjects:@"LOCATION2", nil],
                [NSArray arrayWithObjects:@"LOCATION3", nil],
                nil];

    self.title = @"Location Selection";

    [table reloadData];
    [super viewDidLoad];
}

//MY CELLFORROWATINDEXPATH  

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

    UITableViewCell *cell = [table dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero] autorelease];
    }
    cell.highlighted = NO;

    ***NSArray * rowArray = [menuList objectAtIndex:indexPath.row];***

    UILabel * nameLabel = [[[UILabel alloc] initWithFrame:CGRectMake(15, 8, 200, 20)] autorelease];
    nameLabel.text = [NSString stringWithFormat:@"%@", [rowArray objectAtIndex:0]];
    [cell.contentView addSubview:nameLabel];

    ***cell.accessoryType = (rowArray == selectedIndex && selectedIndex > -1 && selectedIndex < [menuList count]) ? UITableViewCellAccessoryCheckmark : UITableViewCellAccessoryNone;
    return cell;
    ***
}

//MY DIDSELECTROWATINDEXH  

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    int newRow = [indexPath row];

    if (newRow != selectedIndex)
    {
        UITableViewCell *newCell = [tableView cellForRowAtIndexPath:indexPath];
        newCell.accessoryType = UITableViewCellAccessoryCheckmark;

        if (selectedIndex > - 1 && selectedIndex < [menuList count])
        {
            NSUInteger newIndex[] = {0, selectedIndex};
            NSIndexPath *lastIndexPath = [[NSIndexPath alloc] initWithIndexes:newIndex length:2];
            UITableViewCell *oldCell = [tableView cellForRowAtIndexPath: lastIndexPath]; 
            oldCell.accessoryType = UITableViewCellAccessoryNone;
        }       

        selectedIndex = newRow;  
        NSString *selectedValue=[menuList objectAtIndex:selectedIndex];
        [self.delegate rowSelected:selectedValue selectedIndex:selectedIndex];
    }
}

Ответы [ 3 ]

1 голос
/ 08 апреля 2011
- (void)applicationDidEnterBackground:(UIApplication *)application {
}

Используйте этот метод, чтобы сохранить ваши данные в NSUserDefaults и установить данные в viewDidLoad из LocationSelection

0 голосов
/ 08 апреля 2011

Поместите в ваш menuList состояние, которое отражает выбор ячейки, так что даже множественный выбор может быть выполнен легко. Вы можете использовать словарь вместо массивов. Массивы хороши, но не так удобочитаемы, поэтому вы должны запомнить, какое поле содержит что, и сопоставить его с индексом.

Когда загружается представление, загрузите массив menuList из ваших userDefaults, когда приложение закроется, сохраните значения по умолчанию.

В didSelectRowAtIndexPath Вы сохраняете выбор в menuList.

В cellForRowAtIndexPath вы читаете menuList и новый ключ индекса / словаря массива и устанавливаете галочку.

0 голосов
/ 08 апреля 2011

Привет. Я думаю, что вам подойдет, если у вас есть объект (ы) для обозначения галочки. Вы можете сохранить это значение по умолчанию для пользователя через synchronize. В cellForRowATIndexPath: вы можете проверить, присутствует ли значение в пользовательских значениях по умолчанию, и если да, сделать аксессуар ячейки помеченным галочкой, а если его нет, сделать его ничем.

...