2016-04-24 59 views
-1

我想讓一個UIPickerController顯示一些用戶。它的工作原理很輕鬆了,如果我硬編碼了一些示例用戶如下:IOS:從核心數據爲uipicker提取數組

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

不過,我想從核心數據中得出這些用戶。到目前爲止,我已經嘗試了一個簡單的獲取和nsfetchedresults控制器,似乎沒有任何工作。從核心數據獲取數組的首選方式是什麼?

//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. 如果你已經聲明瞭一個屬性命名實幹家(你應該從你的getter聲明:)假設),其申報是類型NSArray而不是id :)

2.改變你的getter爲doers返回一個數組而不是id :)。沒有任何意義返回一個數組,並聲明返回類型爲ID,然後最終重新澆鑄成數組下標使用語法:)

問題在你的代碼來訪問它的實體

_doers是實例變量:) self.doers是一個屬性:)

當您使用@synchronize同步您的屬性(現在您不再編寫它,因爲xcode默認爲您編寫一個)與實體名稱相同的實例變量但在它前面加下劃線用於提供默認的setter和getter屬性:)

你打電話時,你正在訪問的實例變量而不是財產_doers,所以你的getter將永遠不會被稱爲:)

如何解決呢?

,而不是調用返回_doers[row];呼叫self.doers[row]

它會解決這個問題?

不能:)。它返回用戶實體對象的數組:)不串的:)所以,如果你簡單地說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 
    } 

OR

- (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 
    } 

,將工作:)雖然使用getter的屬性:)

這是正確的做法型號很差?

它會工作嗎?當然! ...這是正確的方法嗎?沒門! :)

對於你的選擇器中的每一行調用此方法,因爲你正在訪問財產self.doers其吸氣呼籲,這意味着你將查詢這麼多次的核心數據:)

我的每個細胞:)認爲其未必要的:)你可以做什麼,而在於用戶NSFetchedResultsController一個singletone變量執行viewDidLoad中或viewWillAppear中取一次按照您的要求,並利用其feched對象數組爲您選取器:)

其他

將getter of doers中的代碼移動到一次調用它的方法並填充你的財產一次,一次加滿使用的財產,以填補選擇器:)

Coredata操作是昂貴的:)

反正編碼快樂,萬事如意:)

Declaimer:以上所提供守則僅用於解釋概念,而不是用於複製粘貼的目的:)在盲目使用之前檢查語法:)