Добавление элементов со значением BOOL YES в UITableView

#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];
        }
    }