2016-04-24 5 views
-1

Я пытаюсь показать, что UIPickerController отображает некоторых пользователей. Он работает достаточно легко, если я жестко кодирую некоторых примерных пользователей следующим образом:IOS: выборка из данных ядра для uipicker

//in viewDidLoad 
     _users = @[@"Ronald", @"David", 
          @"Sharon", @"Amir", @"Atul"]; //etc. 

Однако я хочу привлечь этих пользователей из основных данных. До сих пор я пробовал простую выборку, а также nsfetchedresults controller и ничего не работает. Каков предпочтительный способ получения массива из основных данных.

//fetchrequest 

    - (id) getUsers{ 
    NSFetchRequest *fetchRequest = [NSFetchRequest 

fetchRequestWithEntityName:@"User"]; 
    fetchRequest.resultType = NSDictionaryResultType; 


    NSError *error  = nil; 
    self.managedObjectContext = [chModel sharedInstance].managedObjectContext; 

    NSArray *results = [self.managedObjectContext executeFetchRequest:fetchRequest 
                    error:&error]; 

    return results; 
} 

//this throws an error at 

    - (NSString *)pickerView:(UIPickerView *)pickerView 
       titleForRow:(NSInteger)row 
       forComponent:(NSInteger)component 
    { 
     NSLog(@"in titleforrow"); 
     return _users[row];//error here. also error if I substitute [0] 

    } 

//when I try 


_users = [self.fetchedResultsController fetchedObjects]; 
} 

FRC никогда не называют

+0

Обновите свой вопрос с информацией о фактических ошибках. – rmaddy

ответ

1

Два предложений дружище :)

  1. Если вы объявили свойство с именем творящими (которые вы должны иметь в предположении, от вашей геттерной декларации :)) возвестят должен быть типа NSArray, а не id :)

2.Используйте свой приемник для тех, кто возвращает массив, а не id :). Не имеет никакого смысла возвращать массив и объявить тип возвращаемого значения в качестве идентификатора, а затем окончательное повторного приведения его в массив, чтобы получить доступ к его сущности, используя подстрочный синтаксис :)

Проблема в коде

_doers является instance variable :) self.doers является свойством :)

Когда вы синхронизируете свое свойство с помощью @synchronize (теперь вы больше не пишете его, поскольку xcode записывает один для вас по умолчанию) переменные экземпляра, имеющие одно и то же имя как свойство но подчеркивание, префиксное к нему, используется для предоставления установщика по умолчанию и геттера для вашего свойства :)

При вызове _doers вы будете работать с переменной экземпляра, а не свойство, так что ваш добытчик никогда не будет называться :)

Как решить ??

вместо вызова обратного вызова _doers[row];self.doers[row]

Будет ли решить эту проблему ??

Nope :). Он возвращает массив объектов объекта пользователя :) не массив строк :) Так что, если вы просто скажете self.doers[row], вы вернете объект пользователя (словарь в вашем случае) методу, который принимает строку :)

Каков правильный путь?

- (NSString *)pickerView:(UIPickerView *)pickerView 
       titleForRow:(NSInteger)row 
       forComponent:(NSInteger)component 
    { 
     User *userInstance = (User *)self.doers[row]; 
     return userInstance.name; //user entiy attribute which holds name or something like that 
    } 

ИЛИ

- (NSString *)pickerView:(UIPickerView *)pickerView 
       titleForRow:(NSInteger)row 
       forComponent:(NSInteger)component 
    { 
     return [self.doers[row] valueForKey:@"name"] //user entiy attribute which holds name or something like that 
    } 

он будет работать :) хотя очень плохая модель использования поглотителя для свойства :)

Является ли это правильный подход ??

Будет ли это работать? Конечно! ...это правильный способ сделать это? Ни за что! :)

Для каждой строки в вашей палитре этот метод вызывается, потому что вы обращаетесь к собственности self.doers его геттер вызывается для каждой ячейки :) а значит, вы будете запрашивать так много раз ваш основной информации :)

I думаю, что его не-надо :) Что вы можете сделать, а это пользователь NSFetchedResultsController переменной singletone выполняет выборку один раз в viewdidload или viewwillappear согласно вашему требованию и использовать его feched массива объектов для сборщика :)

еще

переместите код в getter doers на метод, вызовите его один раз и заполните ваше имущество и один раз после заполнения использовать свойство для заполнения сборщика :)

операции CoreData являются дорогостоящими :)

Во всяком случае счастливым кодирование, все самое лучшее :)

чтеца: кодекс предусматривает выше только для объяснения понятий, а не с целью копирования пасты :) проверьте синтаксис перед тем, как использовать его вслепую :)

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