2016-04-24 8 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. をあなたは(あなたがゲッター宣言:)から想定しているはずです)徒はそれを宣言するという名前のプロパティを宣言した場合に呼び出されることはありませんIDではなくNSArray型である必要があります。

2. geterを変更して、id:ではなく配列を返すようにします。添字構文を使用して、そのエンティティにアクセスするための配列を返すとidと戻り値の型を宣言するためには何の意味も持たそして、最終的な配列に再キャストしない:)あなたのコード内

問題

_doersですインスタンス変数:self.doersはプロパティです

@synchronizeを使用してプロパティを同期すると(xcodeがデフォルトで書き込みを行うため、これをもう書きません)、プロパティと同じ名前のインスタンス変数接頭辞のアンダースコアは、あなたのプロパティにデフォルトのセッターとゲッターを提供するために使用されます:)

あなたが_doersを呼び出すと、あなたのゲッターが呼ばれることはありませんので、:)

それを解決するためにどのように、インスタンス変数ではなくプロパティにアクセスしています?

代わりの_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 
    } 

それはプロパティのゲッターを使用して、非常に貧弱なモデルかかわらず:)動作します:)

が正しいこのアプローチです??

それは動作しますか?もちろん! ...これを行う正しい方法ですか?とんでもない! :)行ごとに

をごピッカーで、プロパティにアクセスしていることは、セルごとに呼び出され、そのゲッター:)あなたは何度も自分のコアデータを照会することを意味しself.doersので、このメソッドが呼び出されます:)

私はその不必要な:)あなたはむしろ何ができるかは、ユーザーNSFetchedResultsControllerにあると思いsingletone変数あなたの要件ごとにのviewDidLoadまたはviewwillappearに一度フェッチして、ピッカーのためにそのfechedオブジェクトの配列を使用して行う:)

実行者のゲッターにあるコードをメソッドに一度移動して読み込み一度、一度使用プロパティを満たしたあなたの財産は、ピッカー:)

Coredata操作が高価である:)

とにかく幸せなコーディングを埋めるために、すべての最高:)

Declaimer:上記のコードですコンセプトを説明するためのみで、コピー貼り付けの目的ではありません:)盲目的に使用する前に構文をチェックしてください:)