2015-05-27 1 views
0

Хорошо, поэтому я новичок, пытающийся написать практическое приложение, где вы нажимаете кнопку, появляется NSOpenPanel, вы выбираете файл изображения, и изображение отображается в NSImageView ,Настройка NSImage NSImageView из NSURL

У меня открытая панель работает нормально, и она возвращает NSArray из NSURLs. Я избегал использовать пути имен файлов, поскольку документы Apple заявили, что они обесценились. Затем я попытаюсь сделать объект NSImage с помощью initWithContentsOfURL, а затем попробуйте setImage из 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. Это, наверное, что-то действительно простое, но я не могу понять это.

+0

Используйте self.imageViewer или используйте _imageViewer. Я предлагаю использовать self.imageViewer, поскольку он использует setter. –

ответ

0

Итак, теперь я чувствую себя глупо. Я все еще изучаю материал, поэтому не был уверен, почему он замерзает, пока я не заметил, что Xcode постоянно переключается на панель «Отладка», которая подсказывает мне, что может произойти.

Я понял, что случайно щелкнул номер строки, который, по-видимому, устанавливает точки останова для отладки. Я также мог бы как-то нажать «Переключить глобальное состояние точки останова» в нижнюю область отладки.

Поскольку я выбрал линию, где был setImage, это выглядело так, что приложение разбилось/зависало всякий раз, когда оно попадало в эту строку, но на самом деле это просто приостановило приложение, чтобы я мог посмотреть, что происходит с приложением и отладить его , Я отменил выделение строк и отключил кнопку состояния глобальной точки останова, и теперь все работает нормально.

Ошибка новичка-кодера у кого-то, не работающего в среде IDE. : P

0

Попробуйте этот код.

- (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]; 
     } 
    } 
1

Вы должны объявить в заголовках (.h) interface переменную imageViewer, например:

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

Тогда в классе (.m) просто синтезировать переменную:

@implementation AppDelegate 
@synthesize imageViewer; 

... 

Поскольку у вас не было declared переменная в interface, вы получали ошибку.