【问题标题】:View controllers aren't talking to each other视图控制器不相互交谈
【发布时间】:2014-09-18 05:43:09
【问题描述】:

我有一个基于文档的应用程序。它应该是一个 PDFViewer,用户从左侧表格中选择一个 PDF 并将其加载到右侧的 PDF 视图中。

在我的 Document 类中,我创建了我的 WindowController 的一个实例,它是我 Document.xib 的文件所有者,并使它成为这样的窗口控制器:

- (id)init
{
    self = [super init];
    if (self) {
        controller = [[WindowController alloc] initWithWindowNibName:@"Document"];  }
    return self;
}

-(void)makeWindowControllers {

    [self addWindowController: controller];
}

然后我的窗口控制器创建一个控制我的 NSTableView 的 TableViewController 的实例:

@implementation WindowController

-(id)initWithWindowNibName:(NSString *)window {
    self = [super initWithWindowNibName:window];
    return self;
}

-(void)windowDidLoad
{
    tableViewController = [[TableViewController alloc] init];
}

@end

TableViewController 有一个连接到我的 NSTableView 的插座。

TableViewController 然后通过拥有一个 PDFViewerController 的实例来控制 PDFViewer,该实例在它的 init 方法中被分配和初始化。 PDFViewerController 类也有一个连接到我的 PDFView 的插座。

PDFViewerController 有这个加载 PDF 的方法:

-(void) loadFromPath: (NSString *) path{
    NSLog(@"PDFController trying to load path %@", path);
    PDFDocument *pdfDoc = [[PDFDocument alloc] initWithURL: [NSURL fileURLWithPath: path]];
    [pdfView setDocument: pdfDoc];
}

当表格视图选择发生变化时,它应该告诉 loadFromPath: 从 PDFViewerController 实例将该 PDF 加载到视图中,如下所示:

-(void) tableViewSelectionDidChange:(NSNotification *)notification{
    // If the user clicks another file in the list we should let everyone know the path
    selectedPath = [[list objectAtIndex: [[notification object] selectedRow]] path];
    NSLog(@"trying to load path %@", selectedPath);
    [pdfViewerController loadFromPath: selectedPath];
}

但是我的 PDFViewer 根本没有响应。我不知道为什么……我把所有东西都连接起来了。如果我告诉它在 PDFViewerController 的 init 方法中加载 PDF,它工作正常,对于 TableViewController 也是如此。看来我只是不能调用实例方法?我在这里做错了什么?

【问题讨论】:

  • 这两个视图控制器链接在一个导航控制器中?您是否尝试过在 tableViewSelectionDidChange: 中重新实例化 PdfViewerController ?
  • 不,它们没有在导航控制器中链接。他们需要吗?目前,我只是想在两者之间进行互动。我只是尝试重新实例化它,仍然没有运气。
  • 我仍在试图弄清楚你在那里做什么。您以模态方式展示了 PdfViewerController?当你调用这行 [pdfViewerController loadFromPath: selectedPath]; 会发生什么?
  • 当我拨打该线路时,绝对没有任何反应。我希望它将 selectedPath 发送到 loadFromPath 方法,该方法随后将该路径加载到我的 PDFView 中。我可以从 PDFViewController 类的 init 方法将 PDF 加载到 PDFView 中,但是当我从实例中加载时,似乎什么也没发生。

标签: objective-c cocoa pdf quartz-2d


【解决方案1】:

您没有展示 pdfViewerController

//Instantiate pdfViewerController from xib / storyboard
PdfViewerController *pdfViewerController = [[PdfViewerController alloc] initWithNibName:@"PdfViewerController" bundle:nil];
//Present it modally
[self presentViewController:pdfViewerController  animated:YES completion:nil];

如果您使用故事板:Use this url

希望应该做的事情!

【讨论】:

  • 对不起,我不知道为什么我在IOS下标记了这个,因为我不在IOS上。我已经删除了标签。我认为这个建议适用于 IOS?因为我不知道故事板是什么...
猜你喜欢
  • 1970-01-01
  • 2011-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-06
  • 2010-09-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多