3

毎日の読書ガイドとして使用されるアプリを作成しています。データはすべて、アプリに保存される XML に保存され、pubDate に基づいて並べ替えられます。各セクションコードの行数ですが、数字だけ入れるとエラーになるのですが、

[array count];

すべてのアイテムが表示されます。目標を達成するために何をすべきかについての提案を得ることができますか?

編集:これが私のアプリのコードです。ASIHTTPRequest と GDataXML を使用して XML を解析し、各項目を配列に格納します。私がやろうとしているのは、最初のエントリー日 1 のみを表示し、次の日 2 を追加する、などです。配列カウント以外の numberOfRowsInSection に他の数値を入力すると、クラッシュします。これは、配列エントリを日付でソートするために使用されるコードによるものだと思います。

- (void)requestFinished:(ASIHTTPRequest *)request {

    [_queue addOperationWithBlock:^{

        NSError *error;
        GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:[request responseData] 
                                                               options:0 error:&error];
        if (doc == nil) { 
            NSLog(@"Failed to parse %@", request.url);
        } else {

            NSMutableArray *entries = [NSMutableArray array];
            [self parseFeed:doc.rootElement entries:entries];                

            [[NSOperationQueue mainQueue] addOperationWithBlock:^{

                for (RSSEntry *entry in entries) {

                    int insertIdx = [_allEntries indexForInsertingObject:entry sortedUsingBlock:^(id a, id b) {
                        RSSEntry *entry1 = (RSSEntry *) a;
                        RSSEntry *entry2 = (RSSEntry *) b;
                        return [entry1.articleDate compare:entry2.articleDate];
                    }];

                    [_allEntries insertObject:entry atIndex:insertIdx];
                    [self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:insertIdx inSection:0]]
                                          withRowAnimation:UITableViewRowAnimationRight];

                }                            

            }];

        }        
    }];
    [self.refreshControl endRefreshing];

}

これを日付順に変更し、最初の日に最も早いものを表示し、毎日 1 つ追加するにはどうすればよいですか?

4

4 に答える 4

4

日付の値を NSUserDefaults に保存し、それを使用して日が変わったかどうかを比較して確認し、それを使用してセクションの行数を変更します。このコードがよりよく説明されることを期待して、私はこのコードに多くのコメントを付けました。

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

    NSCalendar *calendar = [NSCalendar autoupdatingCurrentCalendar];

    int numberOfDays = 0;   //initialize integer variable    

    //get the current date from the user's device
    NSDate *now = [NSDate date];

    //create a dateformatter to handle string conversion
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateStyle:NSDateFormatterMediumStyle];

    // String to store in defaults.
    NSString *todaysDateString = [dateFormatter stringFromDate:now];

    // get access to the user defaults
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

    if (![defaults valueForKey:@"date_last_opened"]) {

        // if there is no value for the key, save today's date as the string we formatted
        [defaults setValue:todaysDateString forKey:@"date_last_opened"];

    } else {

        // there is already a value for date-last-opened, so pull it from the defaults, and convert it from a string back into a date.
        NSDate *dateLastOpened = [dateFormatter dateFromString:[defaults valueForKey:@"date_last_opened"]];

        if ([dateLastOpened compare:now] == NSOrderedAscending) {

            // if the date_last_opened is before todays date, get the number of days difference.

            unsigned int unitFlags = NSDayCalendarUnit;
            NSDateComponents *comps = [calendar components:unitFlags fromDate:dateLastOpened  toDate:now options:0];

            numberOfDays = [defaults integerForKey:@"totalDays"] + [comps day];
        [defaults setInteger:numberOfDays forKey:@"totalDays"];
        }
    }

return numberOfDays;

}

編集:このコードは、viewDidLoad のように、アプリの最初の起動時に @"totalDays" のようなキーの NSUserDefault 値を 1 に設定していることを前提としています。

if (![defaults integerForKey:@"totalDays"]) {

        // if there is no value for the key, set it to 1
        [defaults setInteger:1 forKey:@"totalDays"];

    }
于 2012-12-05T00:15:38.407 に答える
2

あなたのクラス AppDelegate.m では、これを行うことができます:

//Application did launch
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
  int count = [[NSUserDefaults standardUserDefaults] integerForKey:@"LaunchCount"];
  if(count < 0) count = 0;
  [[NSUserDefaults standardUserDefaults] setInteger:count+1 forKey:@"LaunchCount"];
}

//The application was in background and become active
- (void)applicationWillEnterForeground:(UIApplication *)application
{
  int count = [[NSUserDefaults standardUserDefaults] integerForKey:@"LaunchCount"];
  if(count < 0) count = 0;
  [[NSUserDefaults standardUserDefaults] setInteger:count+1 forKey:@"LaunchCount"];
}

次に、NSUserDefault キー @"LaunchCount" を使用して、テーブル行を追加できます。

于 2012-12-22T05:34:06.187 に答える
0

NSTimeInterval24時間のようなものはどうですか 。

于 2012-12-24T02:40:29.083 に答える
0

[array count] 行の 1 つのセクションが必要なようですが、現在は [array count] セクションと [array count] 行を返しています。

于 2012-12-04T22:58:49.287 に答える