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

两件快速的事情:

首先,在您的委托响应选择器检查中,确保您正在测试正确的方法。您在检查中有“finishedReading:”,然后在方法调用中调用finishedREadingWithPosition:“。我的猜测是它跳过了该行,因为它是您检查的错误选择器。

接下来确保 self.position 有一个值,并且:我同意提到 @He 的 [super] 调用 - 需要调用相同的方法

于 2013-03-26T00:56:15.123 回答