2013-09-25 3 views
0

У меня есть основной вид с кнопкой, которая при нажатии добавляет URL-адрес из веб-представления (например, закладки) в виде таблицы. Единственная проблема заключается в том, что она не загружается. Ив был на нем часами, но не мог понять это. Я думаю, что загружаю данные в табличном представлении неправильно, но не уверен.NSUserDefault не загружается в виде таблицы

Это MainViewController.m

- (IBAction)bookmark:(id)sender { 
    UIActionSheet *actionSheet = 
     [[UIActionSheet alloc] initWithTitle:[[[[self webView] request] URL] 
      absoluteString] delegate:nil cancelButtonTitle:@"Cancel" 
      destructiveButtonTitle:nil otherButtonTitles:@"Add", nil]; 
    [actionSheet showInView:self.view]; 
} 

- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex { 
    if (buttonIndex == 0) { 
     NSMutableArray *bookmarks = [[[NSUserDefaults standardUserDefaults] 
      arrayForKey:@"Bookmarks"] mutableCopy]; 

     if (!bookmarks) { 
      bookmarks = [[NSMutableArray alloc] init]; 
     } 
     [bookmarks addObject:[[[[self webView]request] URL] absoluteString]]; 
     [[NSUserDefaults standardUserDefaults] setObject:bookmarks 
      forKey:@"Bookmarks"]; 
    } 
} 

Это BookmarksViewController.m

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    NSLog(@"%@", bookmarks); 

    bookmarks = [[[NSUserDefaults standardUserDefaults] 
        arrayForKey:@"Bookmarks"] mutableCopy]; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    static NSString *CellIdentifier = @"Cell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    [[NSUserDefaults standardUserDefaults] setObject:bookmarks forKey:@"Bookmarks"]; 

    cell.textLabel.text = [self.bookmarks objectAtIndex:indexPath.row]; 
    return cell; 
} 
+0

Есть ли место, где вы синхронизируете NSUserDefaults? [[NSUserDefaults standardUserDefaults] synchronize]; – Jonathan

+0

Я фактически синхронизировал его сейчас, но это не решило проблему. @Jonathan – Maroun

+0

Вам не нужно вызывать 'synchronize'. Это делается автоматически. – rmaddy

ответ

0

Когда ваше приложение первый запуск ничего не установлен для Bookmarks ключа в NSUserDefaults. Таким образом, линия:

bookmarks = [[[NSUserDefaults standardUserDefaults] 
       arrayForKey:@"Bookmarks"] mutableCopy]; 

в viewDidLoad оставляет bookmarks набор для nil.

В своем обработчике действий вы действительно имеете дело с этим должным образом.

И еще одна большая проблема, это вызов:

[[NSUserDefaults standardUserDefaults] setObject:bookmarks forKey:@"Bookmarks"]; 

в методе cellForRowAtIndexPath.... Почему вы обновляете NSUserDefaults каждый раз, когда ячейка нужна? Не делай этого.

+0

ok, поэтому я перезагрузил свой табличный вид, я избавился от [[NSUserDefaults standardUserDefaults] setObject: bookmarks forKey: @ "Bookmarks"]; , но что я должен сделать для метода в viewDidLoad. – Maroun

+1

То же самое, что и в обработчике обработчика действий. Проверьте «nil» и обработайте его правильно. – rmaddy

0

Команда [tableView dequeueReusableCellWithIdentifier:CellIdentifier] НЕ всегда возвращает ячейку. Он возвращает ячейку только в том случае, если есть ячейка в очереди многоразовых ячеек.

Таким образом, ваш метод должен быть:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    static NSString *CellIdentifier = @"Cell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
    } 
    [[NSUserDefaults standardUserDefaults] setObject:bookmarks forKey:@"Bookmarks"]; 

    cell.textLabel.text = [self.bookmarks objectAtIndex:indexPath.row]; 
    return cell; 
} 
+0

Ваше утверждение не обязательно верно. Бывают случаи, когда 'dequeueReusableCellWithIdentifier' никогда не возвращает' nil'. Но независимо, если бы это была проблема, тогда была бы ошибка времени выполнения для возврата 'nil' из метода cellForRow .... Ничего из этого не имеет ничего общего с тем, почему закладки не отображаются. – rmaddy

Смежные вопросы