1

NSDate開始日と終了日の2 つがあります。開始日から終了日までのすべての日付を検索したい。以下のコードを試しましたが、次のエラーが発生します。

-[__NSDate length]: unrecognized selector sent to instance 0xa484b30

self.m_maEventsForMonth = [NSMutableArray array];
NSPredicate * sPredicate = [NSPredicate predicateWithFormat:@"(date >= %@) AND (date <= %@)", start, end];
[self.m_maEventsForMonth setArray:[m_maEvents filteredArrayUsingPredicate:sPredicate]];

また、次のように開始文字列と終了文字列を作成しようとしましたが、間違った結果が得られました。

NSString * sDateStart = [self dateToString:start format:@"M/d/yyyy"];
NSString * sDateEnd = [self dateToString:end format:@"M/d/yyyy"];

self.m_maEventsForMonth = [NSMutableArray array];
NSPredicate * sPredicate = [NSPredicate predicateWithFormat:@"(date BETWEEN %@)", @[sDateStart, sDateEnd]];

[self.m_maEventsForMonth setArray:[m_maEvents filteredArrayUsingPredicate:sPredicate]];

何が悪いのかわかりません。どんな助けでも大歓迎です。

アップデート:

私の m_maEvents は、カスタム EventObjects が次のように定義された NSMutableArray です。

@interface EventObject : NSObject
{
    NSString    * title;
    NSString    * date;
    NSString    * starttime;
    NSString    * endtime;
    NSString    * location;
    NSString    * url;
    NSMutableArray  * m_EventTypes;
    NSDate      * dtDate;
}

@property (nonatomic, retain) NSString * title;
@property (nonatomic, retain) NSString * date;
@property (nonatomic, retain) NSString * starttime;
@property (nonatomic, retain) NSString * endtime;
@property (nonatomic, retain) NSString * location;
@property (nonatomic, retain) NSString * url;
@property (strong, nonatomic) NSMutableArray * m_EventTypes;
@property NSDate * dtDate;

これらのオブジェクトを文字列で初期化し、init メソッドで NSDate オブジェクトを作成します。これは実際には問題ではありません。私の問題は、述語を定義して2つの日付間の日付をフィルタリングする方法がわからないことです。NSDate オブジェクトと文字列を自由に使用できますが、述語を定義する方法がわかりません。文字列を使用して比較すると思うので、長さエラーが発生します。

カスタム比較メソッドが必要ですか? もしそうなら、私はそれをしていません。

4

2 に答える 2

0

残念なことに、必要なのは述語ステートメントで正しい属性を使用することだけでした。正しい属性は、日付ではなく dtDate です。

于 2013-01-07T14:59:59.040 に答える
0

それがうまくいくことを願っています:

NSMutableArray dates = [NSMutableArray array];
NSDate *curDate = startDate;
while([curDate timeIntervalSince1970] <= [endDate timeIntervalSince1970]) //you can also use the earlier-method
{
    [dates addObject:curDate];
    curDate = [MSDate dateWithTimeInterval:86400 sinceDate:curDate];
}

(注意してください: 86400 = 60*60*24 (1 日))。

それがうまくいくことを願っています。

于 2013-01-07T14:37:02.253 に答える