【问题标题】:set Delegate to Subclass of NSImageView placed in Xib将 Delegate 设置为放置在 Xib 中的 NSImageView 的子类
【发布时间】:2012-10-01 06:39:04
【问题描述】:

我有一个NSImageView 子类,用于将文件拖放到我的应用程序中。

为此,我创建了NSImageView 的子类,并将NSImageView 拖到我的XIB 上,然后将XIB NSImageView 对象的类设置为我的自定义子类。

拖放后一切正常,我知道拖放后我有正确的文件。

当我想根据拖入的文件更新 MainViewController 上的文本字段时,问题就出现了。

我创建了以下子类和协议

#import <Cocoa/Cocoa.h>
#import <Quartz/Quartz.h>

@protocol PDFDraggedIntoWell <NSObject>
@required
-(void)PDFDraggedIntoWellWithURL:(NSURL*) importedURL;

@end


@interface DragAndDropImageView : NSImageView

@property (strong) id <PDFDraggedIntoWell> delegate;

@end

然后在子类的实现中我尝试调用委托方法

-(void) finishedDragginInFileWithURL:(NSURL*) importedURL{
    if( self.delegate != nil && [ self.delegate respondsToSelector: @selector(PDFDraggedIntoWellWithURL:)]) {
        [self.delegate performSelector:@selector(PDFDraggedIntoWellWithURL:) withObject:importedURL];
    }
}

我遇到的问题是如何分配委托。从 XIB NSImageView 到我的 MainviewController 我连接了一个 IBOutlet

@property (weak) IBOutlet DragAndDropImageView *draggedFileImageView;

我已经声明我的 ViewController 将接收委托

@interface MyMainUIViewController ()<PDFDraggedIntoWell>

实施适当的方法

-(void) PDFDraggedIntoWellWithURL:(NSURL *)importedURL{   }

现在我已经尝试在各个地方将委托分配给 self(在 viewDidLoad - 因为视图正在加载到 XIB 中,所以没有被调用??)以及

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil

但我得到的只是调试时委托仍然为零。

我做错了什么?感谢您的帮助!

【问题讨论】:

  • 什么是MyMainUIViewController 定义为(NSObjectNSWindowControllerNSViewController 等)的子类?
  • 它是一个 NSViewController

标签: objective-c xcode macos cocoa delegates


【解决方案1】:

如果您使用的是 xibx,则调用 initWithCoder 方法进行初始化。在那里设置你的代表。

- (id)initWithCoder:(NSCoder *)aDecoder {
    self = [super initWithCoder:aDecoder];
    if (self) {
        UIView *myView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
        myView.delegate = self;
    }
    return self;
}

或者通过界面生成器设置委托,方法是从文件所有者拖动 wile 按住 ctrl 到您的视图。像这样:

【讨论】:

  • 谢谢 Pfitz,initwithCoder 方法会去哪里?在我的主视图控制器中?如果它进入子类 NSImageView 实现,它怎么知道委托需要引用哪个类?我的 IB 也没有将委托显示为可用的渠道之一?再次感谢。
【解决方案2】:

我能够将委托添加到 awakefromnib(in mymainviewcontroller) 方法中,现在一切正常。谢谢

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多