从 NSURL 设置 NSImageView 的 NSImage
Setting the NSImage of a NSImageView from a NSURL
好的,所以我是一个新手,我想写一个练习应用程序,你点击一个按钮,一个 NSOpenPanel
出现,你 select 一个图像文件,图像显示在一个NSImageView
.
我的打开面板工作正常,它 returns NSArray
的 NSURLs
。我避免使用文件名路径,因为 Apple 文档说它已被贬值。然后我尝试使用 initWithContentsOfURL
制作 NSImage
object,然后尝试将 NSImageView
的 setImage 设置为新图像。
以下是我认为实施的相关部分...
- (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];
}
}
并且来自 header:
@property (weak) IBOutlet NSImageView *imageViewer;
- (IBAction)openImage:(NSButton *)sender;
@end
当我尝试设置图像时,Xcode 说有 imageViewer
未声明,并希望将其更正为 _imageViewer
。我试着听从它的建议并 运行 它,但是当我从打开的面板 select 一个文件时,应用程序就崩溃了,所以显然还是不对。
NSLog
行显示按钮被点击,并显示 selected 文件的正确 URL,但我在设置 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]);
NSURL *url = (NSURL *)selectedFile[0];
NSString *filePath = [url absoluteString];
NSImage *theImage = [[NSImage alloc] initWithContentsOfFile:filePath];
[imageViewer setImage:theImage];
}
}
您需要在 headers (.h
) interface
中声明变量 imageViewer
,例如:
@interface AppDelegate : NSObject <NSApplicationDelegate> {
IBOutlet NSImageView *__weak imageViewer;
}
@property (weak) IBOutlet NSImageView *imageViewer;
- (IBAction)openImage:(NSButton *)sender;
@end
然后在你的 class (.m
) 中合成变量:
@implementation AppDelegate
@synthesize imageViewer;
...
由于您没有 declared
interface
中的变量,您收到了错误消息。
好吧,我现在觉得自己很蠢。我仍在学习东西,所以我不确定为什么它会冻结,直到我注意到 Xcode 一直切换到 "Debug" 面板,这让我了解可能发生的事情。
我发现我不小心点击了一个行号,这显然是为调试设置了断点。我也可能以某种方式单击了底部调试区域中的 "Toggle global breakpoint state"。
因为我选择了 setImage
所在的行,它看起来像应用程序 crashed/froze 每当它到达该行时,但实际上它只是暂停了应用程序让我看看发生了什么使用应用程序并调试它。我取消选择了这些行并关闭了全局断点状态按钮,现在一切正常。
一个不习惯在 IDE 中工作的人的新手编码错误。 :P
好的,所以我是一个新手,我想写一个练习应用程序,你点击一个按钮,一个 NSOpenPanel
出现,你 select 一个图像文件,图像显示在一个NSImageView
.
我的打开面板工作正常,它 returns NSArray
的 NSURLs
。我避免使用文件名路径,因为 Apple 文档说它已被贬值。然后我尝试使用 initWithContentsOfURL
制作 NSImage
object,然后尝试将 NSImageView
的 setImage 设置为新图像。
以下是我认为实施的相关部分...
- (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];
}
}
并且来自 header:
@property (weak) IBOutlet NSImageView *imageViewer;
- (IBAction)openImage:(NSButton *)sender;
@end
当我尝试设置图像时,Xcode 说有 imageViewer
未声明,并希望将其更正为 _imageViewer
。我试着听从它的建议并 运行 它,但是当我从打开的面板 select 一个文件时,应用程序就崩溃了,所以显然还是不对。
NSLog
行显示按钮被点击,并显示 selected 文件的正确 URL,但我在设置 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]);
NSURL *url = (NSURL *)selectedFile[0];
NSString *filePath = [url absoluteString];
NSImage *theImage = [[NSImage alloc] initWithContentsOfFile:filePath];
[imageViewer setImage:theImage];
}
}
您需要在 headers (.h
) interface
中声明变量 imageViewer
,例如:
@interface AppDelegate : NSObject <NSApplicationDelegate> {
IBOutlet NSImageView *__weak imageViewer;
}
@property (weak) IBOutlet NSImageView *imageViewer;
- (IBAction)openImage:(NSButton *)sender;
@end
然后在你的 class (.m
) 中合成变量:
@implementation AppDelegate
@synthesize imageViewer;
...
由于您没有 declared
interface
中的变量,您收到了错误消息。
好吧,我现在觉得自己很蠢。我仍在学习东西,所以我不确定为什么它会冻结,直到我注意到 Xcode 一直切换到 "Debug" 面板,这让我了解可能发生的事情。
我发现我不小心点击了一个行号,这显然是为调试设置了断点。我也可能以某种方式单击了底部调试区域中的 "Toggle global breakpoint state"。
因为我选择了 setImage
所在的行,它看起来像应用程序 crashed/froze 每当它到达该行时,但实际上它只是暂停了应用程序让我看看发生了什么使用应用程序并调试它。我取消选择了这些行并关闭了全局断点状态按钮,现在一切正常。
一个不习惯在 IDE 中工作的人的新手编码错误。 :P