Как создать UITableView с историей нажатий кнопок

Я создаю приложение, в котором должна быть указана дата и время нажатия кнопки и помещен список в UITableView. Моя идея состоит в том, чтобы получать дату и метку времени каждый раз, когда пользователь нажимает кнопку, а затем сохранять ее в массиве объектов словаря каждого времени и даты, когда была нажата кнопка. У меня также будет другая кнопка, которая просто загружает модальное представление, которое отображает упомянутый UITableView со списком истории нажатий кнопок.

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

Вот скриншот таблицы изначально с одной записью.

и это то, что происходит, когда я нажимал кнопку много раз. Он отображает обновленное время для всех строк.

Как я могу отобразить историю в таблице и предотвратить ее обновление? Я просто использую NSUserDefaults также в сохранении данных.

Вот некоторый код в моем методе Button Clicked:

- (IBAction)btnClicked:(id)sender
{
    NSLog(@"Button pressed");

    // Gets the current time and formats it
    NSDate *timeNow = [NSDate date];
    NSDateFormatter *timeFormatter = [[NSDateFormatter alloc] init];
    [timeFormatter setDateFormat:@"HH:mm a"];

    // Gets the current date and formats it
    NSDate *dateNow = [[NSDate alloc] init];
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"MMM dd, yyyy"];

    NSString *currentTime = [timeFormatter stringFromDate:timeNow];
    NSString *currentDate = [dateFormatter stringFromDate:dateNow];
    NSString *timestamp = currentTime;
    NSString *date = currentDate;

    // This is where values gets saved
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setObject:timestamp       forKey:@"TimeStamp"];
    [defaults setObject:date            forKey:@"Date"];
    [defaults synchronize];

    NSString *time = [defaults objectForKey:@"TimeStamp"];
    NSString *dateToday = [defaults objectForKey:@"Date"];

    tableVC.tableDict = [[NSMutableDictionary alloc] initWithObjectsAndKeys:time, @"Time", dateToday, @"Date", nil];

    [tableVC.tableArray addObject:tableVC.tableDict];
    [tableVC.table reloadData];
}

Это мой viewDidLoad:

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSString *time = [defaults objectForKey:kTimeStampText];
    NSString *date = [defaults objectForKey:kDateText];

    tableDict = [[NSMutableDictionary alloc] initWithObjectsAndKeys:time, @"Time", date, @"Date", nil];

    tableArray = [[NSMutableArray alloc] initWithObjects:tableDict, nil];
}

Это мои методы таблицы:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}

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

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    CustomCell *customCell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:@"CustomCell"];
    if (customCell == nil)
    {
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"CustomCell" 
                                                     owner:self 
                                                   options:nil];
        for (id oneObject in nib) if ([oneObject isKindOfClass:[CustomCell class]])
            customCell = (CustomCell *)oneObject;
    }

    customCell.dateLbl.text = [tableDict objectForKey:@"Date"];
    customCell.timeLbl.text = [tableDict objectForKey:@"Time"];

    return customCell;
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return 74;
}

1 ответ

Решение

Хорошо, я думаю, что нашел вашу проблему, у вас есть одна и та же дата для каждой строки таблицы.

customCell.dateLbl.text = [tableDict objectForKey:@"Date"];
customCell.timeLbl.text = [tableDict objectForKey:@"Time"];

Это неверно

NSDictionarry *dict = [tableArray objectAtIndex:[indexPath row]];
customCell.dateLbl.text = [dict objectForKey:@"Date"];
customCell.timeLbl.text = [dict objectForKey:@"Time"];

Теперь это должно красиво пройтись по ней и распечатать все даты.

Проблема с вашим кодом заключалась в том, что строка для метода index path вызывается для каждой строки в табличном представлении, то есть это похоже на цикл, поэтому вы присваиваете каждой ячейке свойства самостоятельно, надеюсь, это имеет смысл.

Другие вопросы по тегам