2014-09-17 2 views
0

Итак, у меня есть UITableView, загруженный в UIViewController. В таблице получить данные из NSMutableArrayОбновить UITableView после выбора ABPeoplePicker

Я добавил UIBarButtonItem на NavigationBar, который откроет ABPeoplePickerNavigationController, чтобы выбрать контакт и добавить его имя в NSMutableArray, которое будет отображаться в UITableView

на это резюме мой код

@interface LockedChatsTableView : UIViewController <UITableViewDelegate, UITableViewDataSource, UITextFieldDelegate, ABPeoplePickerNavigationControllerDelegate> 
@property (strong, nonatomic, retain) UITableView *tabView; 
@property (strong, nonatomic) NSMutableArray *listArray; 
@end 


@implementation LockedChatsTableView 

- (void)viewDidLoad { 

    UIBarButtonItem *addButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(showPicker:)]; 
    self.navigationItem.rightBarButtonItem = addButton; 
    self.navigationItem.title = @"Locked Chats"; 

    [self.listArray removeAllObjects]; 

    [self.view setBackgroundColor:[UIColor whiteColor]]; 
    CGFloat width = [UIScreen mainScreen].bounds.size.width; 
    CGFloat height = [UIScreen mainScreen].bounds.size.height; 
    self.tabView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, width, height)]; 
    self.tabView.alwaysBounceVertical = NO; 
    self.tabView.delegate = self; 
    self.tabView.dataSource = self; 

    self.listArray = [[NSMutableArray alloc] init]; 

    NSMutableDictionary *data = [[NSMutableDictionary alloc] initWithContentsOfFile:[self path]]; 
    self.listArray = [data objectForKey:@"LockedChats"]; 
    [self.view addSubview:self.tabView]; 
} 

// .... some tableview delegate method .... 


-(void)addChatWithName:(NSString *)chatName { 
    NSMutableDictionary *data = [[NSMutableDictionary alloc] initWithContentsOfFile:[self path]]; 
    NSMutableArray *lockedChats = [data objectForKey:@"LockedChats"]; 

    [lockedChats addObject:chatName]; 
    [data setObject:lockedChats forKey:@"LockedChats"]; 
    [data writeToFile:[self path] atomically:YES];  
} 

-(void)removeChatWithName:(NSString *)chatName { 
    NSMutableDictionary *data = [[NSMutableDictionary alloc] initWithContentsOfFile:[self path]]; 
    NSMutableArray *lockedChats = [data objectForKey:@"LockedChats"]; 

    [lockedChats removeObject:chatName]; 

    [data setObject:lockedChats forKey:@"LockedChats"]; 
    [data writeToFile:[self path] atomically:YES]; 
} 


// ====================== Contact Picker ======================== // 

- (void)showPicker:(UIBarButtonItem *)sender { 
    ABPeoplePickerNavigationController *picker = [[ABPeoplePickerNavigationController alloc] init]; 
    picker.peoplePickerDelegate = self; 

    [self presentViewController:picker animated:YES completion:nil]; 
} 

- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person { 

    NSString* name = (__bridge NSString*)ABRecordCopyValue(person, kABPersonFirstNameProperty); 
    NSString* lastname = (__bridge NSString*)ABRecordCopyValue(person, kABPersonLastNameProperty); 

    [self addChatWithName:[NSString stringWithFormat:@"%@ %@",name,lastname]]; 

    [self dismissViewControllerAnimated:YES completion:nil]; 

    // [self.tabView performSelectorOnMainThread:@selector(reloadData) withObject:nil]; 
    // [self.tabView reloadData]; 
    return NO; 
} 

// .... some other people picker delegate method .... 

@end 

Так что мой вопрос заключается в том, что, когда я выбрать контакт и сохранить его имя в массив, UITableView не перегрузочный! Я попытался буквально каждый раствор Arround:

  • Я попытался [self.tabView reloadData]; в разных местах, не ЛАК (может быть, потому, что его за пределами основного потока?)

  • Я попытался [self.tabView performSelectorOnMainThread:@selector(reloadData) withObject:nil]; также не перезагрузите таблицу.

  • Я попробовал и прочитать многие другие ответы, найденные на StackOverflow не повезло

Я из идеи и работали над этим мало выпуск целый день! Ваша помощь очень ценится.

+0

@rmaddy iphone был в списке предложений тегов, поэтому я выбрал его: p – iDev

+0

Ничего о вашем вопросе не касается iPhone (физического устройства). Обновите свой вопрос с помощью методов 'numberOfSections' и' numberOfRowsInSection'. Когда вы добавляете вызов 'reloadData' в свой метод' addChatWithName: ', называются ли эти два метода источника данных? – rmaddy

ответ

2

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

  1. Обновление источника данных (self.listArray) с новой информации
  2. вызовов reloadData на столе, на главном потоке

Ваши звонки на reloadData не работают, потому что addChatWithName: и removeChatWithName: только пишут в файл; они не обновляются self.listArray. Поэтому, когда вы вызываете reloadData, новых данных для отображения нет.


Несколько других незначительных вопросов, не имеющих отношения к вашему вопросу:

@property (strong, nonatomic, retain) UITableView *tabView; 

Вы должны удалить retain (это означает то же самое, как strong, и это излишним). Кроме того, я бы не назвал это tabView, потому что будущие читатели могут подумать, что это UITabBar.

[self.listArray removeAllObjects]; 

Вы можете удалить эту строку. self.listArray еще не инициализирован, поэтому ничего не делает.

+0

OMG, я чувствую себя глупо, даже перед тестированием, я уверен, что он сработает! Большое спасибо за то, что указали на меня. О, и о сохранении проблемы, я тестировал некоторые вещи, и я забыл удалить его обратно. Благодаря! :) – iDev

+0

Итак, я добавил 'self.listArray = lockedChats;' как в 'addChatWithName:' ​​и 'removeChatWithName:', а затем сделал '[self.tabView reloadData];' в 'peoplePickerNavigationController:' делегировать метод 'ABPeoplePickerNavigationController' – iDev

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