【问题标题】:Setting the NSImage of a NSImageView from a NSURL从 NSURL 设置 NSImageView 的 NSImage
【发布时间】:2015-05-27 07:13:05
【问题描述】:

好的,所以我是一个新手,正在尝试编写一个练习应用程序,您单击一个按钮,出现NSOpenPanel,您选择一个图像文件,图像将显示在NSImageView 中。

我的打开面板工作正常,它返回 NSArrayNSURLs。我避免使用文件名路径,因为 Apple 文档说它已被折旧。然后我尝试使用initWithContentsOfURL 制作NSImage 对象,然后尝试将NSImageView 的图像设置为新图像。

以下是我认为实现的相关部分...

   - (IBAction)openImage:(NSButton *)sender {
    NSLog(@"%@ was clicked", sender);

    NSOpenPanel *panel = [[NSOpenPanel alloc] init];

    if ([panel runModal] == NSModalResponseOK)
    {
        NSArray* selectedFile = [panel URLs];
        NSLog(@"%@ was selected", selectedFile[0]);
        NSImage *theImage = [[NSImage alloc] initWithContentsOfURL:selectedFile[0]];

        [imageViewer setImage:theImage];
        }
    }

从头开始:

    @property (weak) IBOutlet NSImageView *imageViewer;
    - (IBAction)openImage:(NSButton *)sender;
   @end

当我尝试设置图像时,Xcode 说 imageViewer 未声明,并希望将其更正为 _imageViewer。我尝试按照它的建议运行它,但是一旦我从打开的面板中选择一个文件,应用程序就会崩溃,所以显然还是有问题。

NSLog 行显示按钮已单击,并显示所选文件的正确 URL,但我在设置 NSImageView 时遇到问题。这可能很简单,但我似乎无法弄清楚。

【问题讨论】:

  • 使用 self.imageViewer 或使用 _imageViewer。我建议使用 self.imageViewer,因为它使用了 setter。

标签: objective-c macos cocoa nsimage nsimageview


【解决方案1】:

您需要在标题中声明变量imageViewer (.h) interface,例如:

@interface AppDelegate : NSObject <NSApplicationDelegate> {
     IBOutlet NSImageView *__weak imageViewer; 
}
@property (weak) IBOutlet NSImageView *imageViewer;
- (IBAction)openImage:(NSButton *)sender;
@end

然后在你的班级 (.m) 中合成变量:

@implementation AppDelegate
@synthesize imageViewer;

...

由于您在interface 中没有declared 变量,因此您收到了错误。

【讨论】:

    【解决方案2】:

    试试这个代码。

    - (IBAction)openImage:(NSButton *)sender {
        NSLog(@"%@ was clicked", sender);
    
        NSOpenPanel *panel = [[NSOpenPanel alloc] init];
    
        if ([panel runModal] == NSModalResponseOK)
        {
            NSArray* selectedFile = [panel URLs];
            NSLog(@"%@ was selected", selectedFile[0]);
            NSURL *url = (NSURL *)selectedFile[0];
            NSString *filePath = [url absoluteString];
            NSImage *theImage = [[NSImage alloc] initWithContentsOfFile:filePath];
    
            [imageViewer setImage:theImage];
            }
        }
    

    【讨论】:

      【解决方案3】:

      好吧,我现在觉得自己很愚蠢。我还在学习东西,所以我不知道为什么它会冻结,直到我注意到 Xcode 不断切换到“调试”面板,这让我知道可能会发生什么。

      我发现我不小心点击了一个行号,这显然为调试设置了断点。我也可能以某种方式单击了底部调试区域中的“切换全局断点状态”。

      因为我选择了 setImage 所在的行,所以看起来应用程序在遇到该行时会崩溃/冻结,但实际上它只是暂停了应用程序,以便我查看应用程序的情况并进行调试它。我取消选择了这些行并关闭了全局断点状态按钮,现在一切正常。

      不习惯在 IDE 中工作的新手编码器错误。 :P

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-20
        • 2012-06-05
        相关资源
        最近更新 更多