1

記事のメイン リストがあり、クリックすると読み取りビュー コントローラーに移動し、そのビュー コントローラーが位置を保持する NSNumber プロパティを使用して、ユーザーの読み取りの進行状況を追跡します。戻るボタンを押したときにこの位置をルートビューコントローラーに戻して更新したいのですが(進行状況を表示できるようにするため)、デリゲートが機能していないようです。

読み取りビューの .h ファイル:

@property (nonatomic, weak) id<UpdateProgressDelegate> delegate;

...

@protocol UpdateProgressDelegate <NSObject>

@required
- (void)finishedReadingWithPosition:(NSNumber *)position;

@end

.m ファイル内:

- (void)viewDidDisappear:(BOOL)animated {
    [super viewWillDisappear:YES];

    if ([self.delegate respondsToSelector:@selector(finishedReading:)]) {
        [self.delegate finishedReadingWithPosition:self.position];
    }
}

私のルートビューでは(実際にプロトコルを実装していることに注意してください):

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"ReadBasicArticleSegue"] || [segue.identifier isEqualToString:@"ReadFullArticleSegue"]) {
        ReadingViewController *destination = segue.destinationViewController;

        NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
        self.rowOfLastSelectedCell = @(indexPath.row);
        Article *article = self.articles[[self.rowOfLastSelectedCell intValue]];

        // Set ReadingViewController's variables so the selected article can be read
        destination.textToRead = [article.body componentsSeparatedByString:@" "];
        destination.wordsPerMinute = @(1500);
        destination.numberOfWordsShown = @(3);

        destination.delegate = self;
    }
}

と...

- (void)finishedReadingWithPosition:(NSNumber *)position {
    Article *article = [self.articles objectAtIndex:[self.rowOfLastSelectedCell intValue]];
    article.position = position;

    [self.tableView reloadData];
}

私は自分が間違っていることを理解していません。戻るボタンを押しても、ルート ビュー コントローラーの進行状況インジケーターは 0% のままです。

4

2 に答える 2

2

ここ:

- (void)viewDidDisappear:(BOOL)animated {
    [super viewWillDisappear:YES];

    if ([self.delegate respondsToSelector:@selector(finishedReading:)]) {
        [self.delegate finishedReadingWithPosition:self.position];
    }
}
  • viewDidDisappear:同じ「did」メソッドを..superではなくに渡す必要があります。viewWillDisappear:
    [super viewDidDisappear:animated];

  • セレクターfinishedReading:は、セレクターと同じではありませんfinishedReadingWithPosition:。デリゲートには実装されていないため、条件は呼び出されません。

タイプミス - または解決策は...?

于 2013-03-25T23:40:56.193 に答える
0

2つの簡単なこと:

まず、デリゲートの RespondstoSelector チェックで、正しいメソッドをテストしていることを確認します。チェックに「finishedReading:」があり、メソッド呼び出しで「finishedREADingWithPosition:」を呼び出します。チェック対象のセレクターが間違っているため、その行をスキップしていると思います。

次に、self.position に値があることを確認します。また、@He が言及された [super] 呼び出しに同意します。同じメソッドの呼び出しである必要があります。

于 2013-03-26T00:56:15.123 に答える