#ios #objective-c #uitableview #nsmutablearray #nsarray
#iOS #objective-c #uitableview #nsmutablearray #nsarray
Вопрос:
Ниже приведены имена социальных сетей, привязанные к логическим значениям, которые извлекаются из NSUserDefaults. В предыдущем представлении пользователи могут использовать UISwitches для определения значения логической переменной. Здесь я просто хочу отображать только те социальные сети, в которых пользователь ранее был включен (BOOL YES). Однако, когда я регистрирую изменяемый массив, он даже не выводится. В нынешнем виде массив «medias» выводит значения 1 и 0 соответственно. Будет ли словарь лучшей идеей?
ViewController.m
self.oneTableView.dataSource = self;
self.oneTableView.delegate = self;
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
NSNumber *facebook = [NSNumber numberWithBool:[prefs boolForKey:@"facebook"]];
NSNumber *twitter = [NSNumber numberWithBool:[prefs boolForKey:@"twitter"]];
NSNumber *instagram = [NSNumber numberWithBool:[prefs boolForKey:@"instagram"]];
NSNumber *tumblr = [NSNumber numberWithBool:[prefs boolForKey:@"tumblr"]];
NSNumber *gmail = [NSNumber numberWithBool:[prefs boolForKey:@"gmail"]];
NSNumber *linkedin = [NSNumber numberWithBool:[prefs boolForKey:@"linkedin"]];
NSNumber *github = [NSNumber numberWithBool:[prefs boolForKey:@"github"]];
NSNumber *youtube = [NSNumber numberWithBool:[prefs boolForKey:@"youtube"]];
NSNumber *vine = [NSNumber numberWithBool:[prefs boolForKey:@"vine"]];
NSNumber *soundcloud = [NSNumber numberWithBool:[prefs boolForKey:@"soundcloud"]];
NSArray *medias = @[facebook, twitter, instagram, tumblr, gmail, linkedin, github, youtube, vine, soundcloud];
NSLog(@"%@", medias);
int i;
NSMutableArray *includedMedias = [[NSMutableArray alloc] init];
for (i=0; i <= 10; i =1) {
if ([medias[i] intValue] == 1) {
[includedMedias addObject:medias[i]];
}else{
return;
}
}
NSLog(@"Included Media: %@", includedMedias);
self.tableData = [includedMedias mutableCopy];
self.oneTableView.editing = YES;
Редактировать:
ViewController.m (Из предыдущего контроллера представления, хранящего ключи):
- (void)viewDidLoad
{
[super viewDidLoad];
NSDictionary *socialValues = @{@"facebook": @NO,
@"twitter": @NO,
@"instagram": @NO,
@"tumblr": @NO,
@"gmail": @NO,
@"linkedin": @NO,
@"github": @NO,
@"youtube": @NO,
@"vine": @NO,
@"soundcloud": @NO
};
}
- (void)setupOneCell:(setupOneCell *)cell switchValueDidChange:(BOOL)switchValue {
NSIndexPath *indexPath = [self.oneTableView indexPathForCell:cell];
NSString *label = [self.medias[indexPath.row] socialMedia];
NSString *newLabel = [label.lowercaseString stringByReplacingOccurrencesOfString:@" " withString:@""];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[self.socialValues setValue:[NSNumber numberWithBool:switchValue] forKey:newLabel];
[defaults setObject:self.socialValues forKey:@"valueDict"];
[defaults synchronize];
}
ViewController.m (Извлечение данных из UserDefaults):
- (void)viewDidLoad
{
[super viewDidLoad];
self.oneTableView.dataSource = self;
self.oneTableView.delegate = self;
NSMutableArray *includedMedias = [[NSMutableArray alloc] init];
NSDictionary *mediaDict = [[NSUserDefaults standardUserDefaults] dictionaryForKey:@"valueDict"];
for (NSString *key in mediaDict.allKeys) {
if ([mediaDict[key] intValue] == 1) {
[includedMedias addObject:key];
}
}
}
Комментарии:
1. Итак, вы говорите, что недовольны тем, что он хранит
1
«и0
» вместоYES
«иNO
«?2. @Undo Нет, он сохраняет YES и NO, которые NSNumber преобразует в 1 и 0. Я недоволен тем, что не могу отделить метки единиц в массиве и опубликовать их в таблице.
Ответ №1:
Проблема с кодом заключается в этой части
}else{
return;
}
Как только этот код находит что-то, что не выбрано, он возвращается из метода и, следовательно, никогда не достигает NSLog
или mutableCopy
.
Сказав это, вы можете немного упростить код, создав массив имен носителей, а затем выполнив итерацию по нему, чтобы создать includedMedias
массив.
self.oneTableView.dataSource = self;
self.oneTableView.delegate = self;
NSArray *medias = @[@"facebook", @"twitter", @"instagram", @"tumblr", @"gmail",
@"linkedin", @"github", @"youtube", @"vine", @"soundcloud"];
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
NSMutableArray *includedMedias = [[NSMutableArray alloc] init];
for ( NSString *media in medias )
{
if ( [prefs boolForKey:media] )
[includedMedias addObject:media];
}
NSLog(@"Included Media: %@", includedMedias);
self.tableData = [includedMedias mutableCopy];
self.oneTableView.editing = YES;
Ответ №2:
Было бы лучше, если бы ваши пользовательские настройки по умолчанию сохраняли один словарь, ключами которого были бы имена носителей, а значениями были бы NSNumbers для значений BOOL. Затем вы можете перебирать ключи (полученные из метода allKeys) и добавлять строку ключа в свой изменяемый массив, если значение, связанное с этим ключом, равно 1.
NSMutableArray *includedMedias = [[NSMutableArray alloc] init];
NSDictionary *mediaDict = [[NSUserDefaults standardUserDefaults] dictionaryForKey:@"mediaDict"];
for (NSString *key in mediaDict.allKeys) {
if ([mediaDict[key] intValue] == 1) {
[includedMedias addObject:key];
}
}