Ich habe ein seltsames Problem mit Zebra-Drucker. Auf dem großen Bild habe ich Codes, um Elemente zu holen, um eins nach dem anderen aus der Warteschlange zu drucken. Wenn also der Druckvorgang initiiert wird und sich drei Elemente in der Warteschlange befinden, wird der Code eine Schleife ausführen und die ersten Daten in der Warteschlange abrufen, sie an den Drucker senden und die ersten Daten in der Warteschlange löschen. So ähnlich wie aus der Warteschlange.Zebra Drucker druckt nur aufeinanderfolgende Etiketten, wenn er vom Benutzer angetippt wird
Das Problem besteht darin, dass der Drucker nur das erste Element druckt, wenn es sich um den Code handelt, der die Daten direkt an den Drucker sendet und sendet. Das nächste Element ist verschwunden, obwohl NSLog anzeigt, dass die Druckerverbindung für jedes einzelne Element geöffnet, Daten gesendet, erfolgreich gedruckt und die Druckerverbindung geschlossen wurde.
Aber wenn jedes Mal der Code ein Etikett drucken, und dann die App zeigt Nachrichtenbox wie "OK drücken, um nächstes Etikett zu drucken", und dann den Benutzer tippen Sie auf die Schaltfläche OK, kann es die zweite und den Rest der drucken beschriften Sie nach jedem Tippen auf die Schaltfläche.
Ich habe dann versucht, dies zu emulieren. Ich habe versucht, Timer zu verwenden, um "den Knopf programmgesteuert zu drücken" [btnPrint sendActionsForControlEvents:UIControlEventTouchUpInside]
, benutze ich auch Timer, um die Funktion direkt aufzurufen, oder dem Thread Verzögerung zu geben, aber keiner funktioniert. Es muss von einem Knopf initiiert werden, der von menschlicher Berührung angezapft hat. Ich weiß nicht warum.
Hier ist der Code:
// main function to print
-(void) printLabel {
if ([dataToPrint count] > 0) {
[self printWithData:[dataToPrint objectAtIndex:0]];
}
}
-(void)printWithData:(NSString*) data;
{
NSString *zplString = data;
// do something with zplString
NSLog(@"Sending data to printer");
printHandler = [[PrintingHandler alloc] init];
[printHandler setDelegate:self];
[printHandler initialize];
[printHandler printToSerial:bluetoothSerialNumber withData:zplString];
}
// delegate to call if the print is success
-(void) printIsSuccess
{
[dataToPrint removeObjectAtIndex:0];
// in here, I just use sleep code instead of button tap emulation to avoid unnecessarily too long code
[NSThread sleepForTimeInterval:2.0f];
[self printLabel];
}
// this is method inside PrintingHandler class that get called by PrintingHandler (printToSerial:)
-(void) printLabelWithData:(NSString*) zplData toPrinter:(NSString*) serial withSender:(id) sender
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),^{
// Instantiate connection to Zebra Bluetooth accessory
id<ZebraPrinterConnection, NSObject> thePrinterConn = [[MfiBtPrinterConnection alloc] initWithSerialNumber:serial];
// Open the connection - physical connection is established here.
BOOL success = [thePrinterConn open];
NSError *error = nil;
// Send the data to printer as a byte array.
success = success && [thePrinterConn write:[zplData dataUsingEncoding:NSUTF8StringEncoding] error:&error];
[NSThread sleepForTimeInterval:1.0f];
//Dispath GUI work back on to the main queue!
dispatch_async(dispatch_get_main_queue(), ^{
if (success != YES || error != nil) {
[delegate printFailed];
UIAlertView *errorAlert = [[UIAlertView alloc] initWithTitle:@"Error" message:[error localizedDescription] delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil];
[errorAlert show];
[errorAlert release];
}
else if (success != YES) {
NSLog(@"Print is not success, but no error raised");
[delegate printSuccess];
}
else
{
NSLog(@"Print is success");
[delegate printSuccess];
}
});
// Close the connection to release resources.
NSLog(@"printer connection closed");
[thePrinterConn close];
[thePrinterConn release];
});
}