从另一个ViewController.m访问AppDelegate.m的数组变量

cey*_*uem 0 iphone xcode objective-c

我刚刚解决了关于同一段代码的另一个问题,但我想分开我的两个问题.

我想在我的AppDelegate中存储由Rss解析器生成的表,这样每次加载显示列表的viewcontroller时都不需要再次执行它.为此,我有以下代码:

AppDelegate.h

#import <Three20/Three20.h>

#import "NewsRssParser.h"
#import "NewsRss.h"

@class NewsRssParser;
@class NewsRss;

@interface AppDelegate : NSObject <UIApplicationDelegate,NewsRssParserDelegate> {
    NewsRssParser * _rssParser; 
    NSMutableArray * _newsRssArray;
}

@property(readwrite, retain) NewsRssParser * rssParser;
@property(readwrite, retain) NSMutableArray * newsRssArray;

@end
Run Code Online (Sandbox Code Playgroud)

ApDelegate.m

[...]

@implementation AppDelegate

@synthesize rssParser = _rssParser; @synthesize newsRssArray = _newsRssArray;

[...]

在应用程序执行的某个阶段,表由Rss解析器正确填充.发生这种情况时,我想将其转换为可以在另一个视图控制器中显示的格式:

  • (无效){myFunction的

    NSMutableArray*dsItems = [[[NSMutableArray alloc] init] autorelease];

    for(NewsRss*rssItem in self.rssParser.rssItems){NSString*rssItemTitle = [rssItem title]; NSString*rssItemAuthor = [@"par"stringByAppendingString:[rssItem author]]; NSString*rssItemDescription = [rssItem description]; NSString*rssItemLinkUrl = [rssItem linkUrl]; NSString*rssItemImageUrl = [rssItem mediaUrl];

    TTTableMessageItem *tMsgItem = [TTTableMessageItem itemWithTitle:rssItemTitle caption:rssItemAuthor text:rssItemDescription timestamp:nil imageURL:rssItemImageUrl URL:rssItemLinkUrl];
    [self.newsRssArray addObject:tMsgItem];
    [dsItems addObject:tMsgItem];
    
    Run Code Online (Sandbox Code Playgroud)

    }

}

我通过[_newsRssArray count]在NSdb中显示gdb来控制它的工作原理.它返回10,这是我在RSS提要中的文章数.

这是我想加载我的ViewController以显示文章列表的时候.我是这样做的:

NewsVc.h

#import <Three20/Three20.h>

@protocol NewsVcDelegate;

@class AppDelegate;

@interface NewsVc : TTTableViewController {
    id<NewsVcDelegate> _delegate;

    AppDelegate * _appDelegate;
}

@property(nonatomic,assign) id<NewsVcDelegate> delegate;
@property(nonatomic, retain) AppDelegate * appDelegate;

@end

@protocol NewsVcDelegate <NSObject>

- (void)NewsVc:(NewsVc*)controller didSelectObject:(id)object;

@end
Run Code Online (Sandbox Code Playgroud)

NewsVc.m

[...]

- (void)loadNewsFromParser {

    self.tableView.allowsSelection = NO;

    //reload the table view
    TTListDataSource *ds = [[TTListDataSource alloc] autorelease];
    //NSMutableArray *dsItems = [[[NSMutableArray alloc] init] autorelease];

    NSLog(@"NewsVC(loadNewsFromParser):count/newsRssArray=%d", [self.appDelegate.newsRssArray count]);
    NSLog(@"NewsVC(loadNewsFromParser):count/rssItems=%d", [self.appDelegate.rssParser.rssItems count]);

    [ds initWithItems:self.appDelegate.newsRssArray];

    self.dataSource = ds;
    self.tableView.allowsSelection = YES;

}

[...]
Run Code Online (Sandbox Code Playgroud)

但是在ViewController的这个函数中,我看到数组为空,以及当我尝试直接访问NewsRss的解析数据时.我的AppDelegate/NewsVc代码能够从NewsVc访问这个数组有什么问题?

谢谢你的帮助 !我今天感觉很慢,坚持这个......

Ole*_*ann 5

你在哪里分配appDelegate?在视图控制器初始化中,某处必须有这样的行:

self.appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
Run Code Online (Sandbox Code Playgroud)