2013-12-02 3 views
1

У меня есть приложение с главным окном и дополнительным окном с NSScannerDeviceView в нем. Идея состоит в том, чтобы отсканировать изображение в память и поместить его в NSImageView в главном окне.IKScannerDeviceView работает только один раз

Пока все хорошо. Когда окно сканера открывается, я могу сканировать изображение, и оно помещено правильно в NSImageView.

Проблема в том, что я могу сканировать снова и снова, но если я закрою окно сканирования и снова открою его, NSScannerDeviceView больше не работает. Я уверен, что решение относительно просто, но поскольку я все еще участвую в obj-c/какао, это меня забило.

код я использую следующим образом: ScanWindowController.h

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

@interface ScanWindowController : NSWindowController <IKScannerDeviceViewDelegate, ICScannerDeviceDelegate, ICDeviceBrowserDelegate> { 

ICDeviceBrowser *mDeviceBrowser; 

} 

@property (strong) IBOutlet IKScannerDeviceView *ScannerView; 

@end 

и: ScannerWindowController.m

#import "ScanWindowController.h" 
#import "AppDelegate.h" 

@interface ScanWindowController() 

@end 

@implementation ScanWindowController 

@synthesize ScannerView; 

- (id)init 
{ 
    if (! (self = [super initWithWindowNibName: @"ScanWindowController"])) { 
     return nil; 
    } 

mDeviceBrowser = [[ICDeviceBrowser alloc] init]; 
mDeviceBrowser.delegate = self; 
mDeviceBrowser.browsedDeviceTypeMask = ICDeviceLocationTypeMaskLocal|ICDeviceLocationTypeMaskRemote|ICDeviceTypeMaskScanner; 
[mDeviceBrowser start]; 

return self; 
} 

- (void)windowDidLoad 
{ 
    [super windowDidLoad]; 
} 


- (void)windowWillClose:(NSNotification *)notification { 
    [mDeviceBrowser stop]; 
} 


- (void)scannerDeviceView:(IKScannerDeviceView *)scannerDeviceView didScanToURL:(NSURL *)url fileData:(NSData *)data error:(NSError *)error 
{ 

    if(!error) { 

     [(AppDelegate*)[[NSApplication sharedApplication] delegate] recieveScannedData:data]; 

    } 

} 


- (void)scannerDeviceDidBecomeAvailable:(ICScannerDevice*)scanner; 
{ 

[scanner requestOpenSession]; 
} 


- (void)deviceBrowser:(ICDeviceBrowser*)browser didAddDevice:(ICDevice*)addedDevice moreComing:(BOOL)moreComing 
{ 


    if ((addedDevice.type & ICDeviceTypeMaskScanner) == ICDeviceTypeScanner) 
    { 

     [ScannerView setScannerDevice:(ICScannerDevice*)addedDevice]; 

} 
} 


-(void)deviceBrowser:(ICDeviceBrowser *)browser didRemoveDevice:(ICDevice *)device moreGoing:(BOOL)moreGoing 
{ 
[device requestCloseSession]; 
} 


-(void)didRemoveDevice:(ICDevice*)removedDevice 
{ 
    [removedDevice requestCloseSession]; 
} 


@end 
+0

Когда вы говорите «больше не работает» что вы имеете в виду? Завершает ли это время загрузки интерфейса или показывает, что было раньше, но не работает вход? Вы пытались найти трассировку стека сразу после возникновения проблемы? –

+0

это вид сканера, как только он открывается, но все серое и неактивное. – dmid

+0

- устройство, когда-либо «закрытое»? – tofutim

ответ

1

Я решил эту проблему (после разговора с Apple), и результатом является следующее:

NSScannerDeviceView активируется, когда окно инициализируется, однако, поскольку это не вызвано снова, а NSScannerDeviceView закрывается, когда wi ndow закрыт, он никогда не активируется.

Решение было создать новый метод (scannerReopen) и назовите его каждый раз, когда окно открывается следующим образом:

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

@interface ScanWindowController : NSWindowController <IKScannerDeviceViewDelegate, ICScannerDeviceDelegate, ICDeviceBrowserDelegate> { 

ICDeviceBrowser *mDeviceBrowser; 

} 

@property (strong) IBOutlet IKScannerDeviceView *ScannerView; 

-(void)scannerReopen; 

@end 

и:

#import "ScanWindowController.h" 
#import "AppDelegate.h" 

@interface ScanWindowController() 

@end 

@implementation ScanWindowController 

@synthesize ScannerView; 


- (id)init 
{ 
    if (! (self = [super initWithWindowNibName: @"ScanWindowController"])) { 
    return nil; 
} 

if(!mDeviceBrowser) { 
    mDeviceBrowser = [[ICDeviceBrowser alloc] init]; 
    [mDeviceBrowser setDelegate:self]; 
    mDeviceBrowser.browsedDeviceTypeMask = ICDeviceLocationTypeMaskLocal|ICDeviceLocationTypeMaskRemote|ICDeviceTypeMaskScanner; 
    [mDeviceBrowser start]; 
} 

return self; 
} 

- (void)windowDidLoad 
{ 
    [super windowDidLoad]; 
} 


- (void)windowWillClose:(NSNotification *)notification { 
[mDeviceBrowser stop]; 
} 


- (void)scannerDeviceView:(IKScannerDeviceView *)scannerDeviceView didScanToURL:(NSURL *)url fileData:(NSData *)data error:(NSError *)error 
{ 
//process the scanned data... 
if(!error) { 

    [(AppDelegate*)[[NSApplication sharedApplication] delegate] receiveScannedData:data]; 

} 

} 


- (void)scannerDeviceDidBecomeAvailable:(ICScannerDevice*)scanner; 
{ 

[scanner requestOpenSession]; 
} 


- (void)deviceBrowser:(ICDeviceBrowser*)browser didAddDevice:(ICDevice*)addedDevice moreComing:(BOOL)moreComing 
{ 


if ((addedDevice.type & ICDeviceTypeMaskScanner) == ICDeviceTypeScanner) 
{ 

    [ScannerView setScannerDevice:(ICScannerDevice*)addedDevice]; 

} 
} 


-(void)deviceBrowser:(ICDeviceBrowser *)browser didRemoveDevice:(ICDevice *)device moreGoing:(BOOL)moreGoing 
{ 
[device requestCloseSession]; 
} 


-(void)didRemoveDevice:(ICDevice*)removedDevice 
{ 
    [removedDevice requestCloseSession]; 
} 


-(void)scannerReopen 
{ 

[mDeviceBrowser start]; 

} 

@end 
Смежные вопросы