2011-12-30 11 views
4

私は数値で検索したいNSStringを持っています。 NSNumericSearchが適切な解決策であるようですが、明らかに:、caseInsensitiveCompare:、localizedCompare:およびlocalizedCaseInsensitiveCompare:iOSでフェッチを実行するときにソートセレクタとして機能します。 (これはコアデータプロジェクトです)。これはSQLiteバッキングデータストアと関係があることを私は理解しています。iOS用NSNumericSearchソリューション

文字列をNSNumberにキャストしようとしました。 NSNumberは基本的にintであるため、ARCにはエラーがあります。

要約すると、(1,11,2,25)とは対照的に数値的に(1,2,11,25)文字列をソートしたいと思います。私はどんな解決策にも感謝します。

EDIT:(。。私は上記のために謝罪私は一度離れて自分のコンピュータからだった、と急いで)

限られたソート記述子についての情報がIsted &ハリントンの2011年の最後のページから来てiOSのコアデータを予約します。

@interface NSString (SizeComparison) 
-(NSComparisonResult)sizeCompare:(NSString*)otherString; 
@end 
@implementation NSString (SizeComparison) 
-(NSComparisonResult)sizeCompare:(NSString*)otherString { 
return [self compare:otherString options:NSNumericSearch]; 
} 
@end 

fetchedResultsCntrollerでソート記述子は次のとおりです。:

:それはこのエラーを返します

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"size" ascending:YES selector:@selector(sizeCompare:)]; 

明確にするため

When doing a fetch with sort descriptors you'll need to restrict yourself to the following selectors on iOS: compare:, caseInsensitiveCompare:, localizedCompare:, localizedCaseInsensitiveCompare:.

は、私はこのようなカテゴリを書きました*キャッチされていないexcepによるアプリの終了理由: 'サポートされていないNSSortDescriptorセレクタ:sizeCompare:'

これはIsted & Harringtonのステートメントと一致しているようです。

また、私がNSNumberにキャストしたと言ったとき、私は簡単にしようとしていましたが、明らかに不明でした。これは私がやったことです:

NSNumberFormatter *numformatter = [[NSNumberFormatter alloc] init]; 
numformatter.numberStyle = NSNumberFormatterNoStyle; 
self.objectToEdit.size = [numformatter numberFromString:self.sizeTextField.text]; 

だから、私は数値的にNSStringのを並べ替えたい(1、2、11、25)(1、11、2、25)とは対照的です。私はまだどんな解決策にも感謝します。

+0

あなたの質問は理解するのが少し難しいです。あなたがコアデータを持っていると言うよりも、NSStringを持っていると言います。そしてあなたの「要約」は別のことを言います。あなたの質問を洗練し、いくつかのコードスニペットを提供してください。それは答えを得るチャンスを大きく増加させるでしょう。 – Krizz

+0

NSNumberはintではありません。 –

+0

@Krizzあなたが正しいです。それはひどいポストだった。私は明確にしようとしました。 – Kurt

答えて

8

最後に、文字列を数値でソートする問題に対する答えを見つけました。これは、ブロックの直接使用を伴います。私のソート記述子のために、それは単にである:これはNSStringsは(1、11、2、25)数値的にソートすることを可能にする

NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"size" ascending:NO comparator:^(id obj1, id obj2) { return [obj1 compare:obj2 options:NSNumericSearch]; }]; 

カテゴリがうまくいかなかった理由はわかりません。私は同じ問題に遭遇した他の人のために答えを投稿すると思った。

+0

これは素敵です。ありがとうございました。 (ブロックは悪魔のものですが) – CBGraham

0

apparently only compare:, caseInsensitiveCompare:, localizedCompare: and localizedCaseInsensitiveCompare: work as sort selectors when doing a fetch in iOS

本当に?あなたが使用するセレクタが1つのパラメータ(比較するもう1つの文字列)しか取ることができず、数値比較を行うには-compare:options:を使用する必要があるという問題が多いと思います。

比較を行うカテゴリメソッドを作成してみてください。

@interface NSString(NumericCompare) 

-(NSComparisionResult) compareNumerically: (NSString*) anotherString; 

@end 

@implementation NSString(NumericCompare) 

-(NSComparisionResult) compareNumerically: (NSString*) anotherString 
{ 
    return [self compare: anotherString options: NSNumericSearch]; 
} 

I have tried casting the string to an NSNumber. There is an error with ARC, as NSNumber is basically an int.

あなただけのNSNumberにNSSstringをキャストすることはできません、あなただけのポインタをキャストしている、オブジェクトは指しません。あなたはこの

NSNumber* number = [NSDecimalNumber numberWithString: myStringValue]; 

NSDecimalNumberNSNumberのサブクラスで行うことができます。

+0

JeremyPありがとうございます。私はあなたの配慮に感謝します。あなたが見ることができるように、私はあなたとほぼ同じカテゴリー方法を試みました。編集した投稿にエラーメッセージが表示されます。 – Kurt

0

本当に制限がある場合(実際には私のコードではlocalizedCaseInsensitiveCompare:しか使用しません)、sortDescriptorWithKey:ascending:comparator:を使用して、ブロック内でNSNumericSearchを使用できるはずです。

0

私はNSNumericSearchなしで必要なものを手に入れることができました。

'size'属性をInteger16に変更し、モデルクラスプロパティ 'size'をNSStringからNSNumberに変更し、軽量移行を行いました。

は、その後、私は私の既存のコードほんの少し使用を変更:

aString = [aNumber stringValue]; 

NSNumberFormatter *numformatter = [[NSNumberFormatter alloc] init]; 
numformatter.numberStyle = NSNumberFormatterNoStyle; 
bNumber = [numformatter numberFromString:bString] 

適切なNSStringのとのNSNumberオブジェクトを変更します。

今は私が望むように並べます。

要約すると、データ構造を変更してNSStringを数値的に並べ替えることの問題を回避しました。みんなの入力のための

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:sortKey1 ascending:YES]; 
NSSortDescriptor *sortDescriptor2 = [[NSSortDescriptor alloc] initWithKey:@"size" ascending:YES]; 
NSArray *sortDescriptors = [NSArray arrayWithObjects:sortDescriptor,sortDescriptor2, nil]; 

ありがとう:

ソート記述子はfetchedResultsControllerで使用されるだけで、基本的なものでした。ご迷惑おかけして申し訳ありません。