Использование XCode 6.0.1 на Yosemite. У меня есть свойство, которое получает значение, которое пользователь вводит в текстовое поле, например. "090".Нежелательное смену недвижимости
//
// AppController.h
//
#import <Foundation/Foundation.h>
#import <Cocoa/Cocoa.h>
#import "ORSSerialPort.h"
#import "ORSSerialPortManager.h"
@class ORSSerialPortManager;
#if (MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_7)
@protocol NSUserNotificationCenterDelegate <NSObject>
@end
#endif
@interface AppController : NSObject <ORSSerialPortDelegate,NSUserNotificationCenterDelegate>
@property (nonatomic, retain) NSString *hdgVal;
- (void)printHdg;
@end
Позже мне нужно получить целочисленное значение для сравнения. На строке с надписью «CRASH HERE», когда я нажимаю hdgVal, пузырь говорит «имя класса = _NSArrayI». Нажав на глазное яблоко, произносите 10,10,0.
//
// AppController.m
//
#import "AppController.h"
@implementation AppController
@synthesize hdgVal;
- (void)startTimer
{
hdgTimer = [NSTimer scheduledTimerWithTimeInterval:0.6
target:self
selector:@selector(printHdg)
userInfo:nil
repeats:YES];
}
- (void)printHdg
{
NSInteger currH = [labelCurrHdg integerValue];
NSInteger wantedH = [hdgVal integerValue]; <== CRASH HERE
NSData *dataToSend;
NSString *str;
if (currH > wantedH - 3 && currH < wantedH + 3) {
[hdgTimer invalidate];
hdgTimer = nil;
[labelCurrHdg setStringValue:hdgVal];
[labelCurrHdg needsDisplay];
NSLog(@"Stopping timer");
return;
}
Код, который заполняет hdgVal
- (IBAction)send:(id)sender
{
NSString *sendString = @"";
NSString *tmpStr;
NSString *tmpVal;
NSData *dataToSend;
int i;
int c;
char j;
if([sender tag] ==1)
{
NSButton *btn=(NSButton *)sender;
[btn setTitle:([btn.title isEqualToString:@"LP"] ? @"SP" : @"LP")];
i = [inputTextField intValue];
if(i < 181)
{
i = i + 180;
}
else if (i > 180)
{
i = i - 180;
}
NSNumberFormatter * numberFormatter = [[NSNumberFormatter alloc] init];
[numberFormatter setPaddingPosition:NSNumberFormatterPadBeforePrefix];
[numberFormatter setPaddingCharacter:@"0"];
[numberFormatter setMinimumIntegerDigits:3];
NSNumber * number = [NSNumber numberWithInt:i];
tmpStr = [numberFormatter stringFromNumber:number];
[numberFormatter release];
[inputTextField setStringValue:tmpStr];
hdgVal = tmpStr;
}
else if([sender tag] == 0)
{
[buttonLP setTitle:@"LP"];
tmpStr = [inputTextField stringValue];
while([tmpStr length] < 3)
{
tmpStr = [@"0" stringByAppendingString:tmpStr];
}
[inputTextField setStringValue:tmpStr];
hdgVal = tmpStr;
}
else if([sender tag] ==3)
{
NSButton *btn=(NSButton *)sender;
[btn setTitle:([btn.title isEqualToString:@"LP"] ? @"SP" : @"LP")];
i = [inputTextField2 intValue];
if(i < 181)
{
i = i + 180;
}
else if (i > 180)
{
i = i - 180;
}
NSNumberFormatter * numberFormatter = [[NSNumberFormatter alloc] init];
[numberFormatter setPaddingPosition:NSNumberFormatterPadBeforePrefix];
[numberFormatter setPaddingCharacter:@"0"];
[numberFormatter setMinimumIntegerDigits:3];
NSNumber * number = [NSNumber numberWithInt:i];
tmpStr = [numberFormatter stringFromNumber:number];
[numberFormatter release];
[inputTextField2 setStringValue:tmpStr];
hdgVal = tmpStr;
}
else if([sender tag] == 2)
{
[buttonLP2 setTitle:@"LP"];
tmpStr = [inputTextField2 stringValue];
while([tmpStr length] < 3)
{
tmpStr = [@"0" stringByAppendingString:tmpStr];
}
[inputTextField2 setStringValue:tmpStr];
hdgVal = tmpStr;
}
switch(rotorSelected)
{
case 1: //Alfaspid and Yaesu
case 7:
sendString = @"M";
sendString = [sendString stringByAppendingString:(hdgVal)];
sendString = [sendString stringByAppendingString:@"\r\n"];
dataToSend = [sendString dataUsingEncoding:NSUTF8StringEncoding];
[serialPort sendData:dataToSend];
break;
case 2: //DCU
sendString = @"AP1";
sendString = [sendString stringByAppendingString:(hdgVal)];
sendString = [sendString stringByAppendingString:@";AM1;"];
NSLog(@"SendString = %@", sendString);
dataToSend = [sendString dataUsingEncoding:NSUTF8StringEncoding];
[serialPort sendData:dataToSend];
if (!hdgTimer)
{
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.5]];
[self startTimer];
}
break;
case 3: //Prosistel A B C
c = 2;
j = (char)c;
tmpVal = [NSString stringWithFormat:@"%c", j];
dataToSend = [tmpVal dataUsingEncoding:NSUTF8StringEncoding];
[self.serialPort sendData:dataToSend];
tmpStr = [inputTextField stringValue];
for (i = 0 ; i < [tmpStr length]; i++)
{
NSLog(@"Iteration: %d", i);
tmpVal = [tmpStr substringWithRange:NSMakeRange(i, 1)];
c = [tmpVal intValue];
j = (char)c;
tmpVal = [NSString stringWithFormat:@"%c", j];
dataToSend = [tmpVal dataUsingEncoding:NSUTF8StringEncoding];
[self.serialPort sendData:dataToSend];
}
c = 13;
j = (char)c;
dataToSend = [tmpVal dataUsingEncoding:NSUTF8StringEncoding];
[self.serialPort sendData:dataToSend];
break;
case 4: //Prosistel CBOX/D
//char c = 0x02; dataToSend = [NSData dataWithBytes:&c length:1]
j = 0x02;
dataToSend = [NSData dataWithBytes:&j length:1];
[self.serialPort sendData:dataToSend];
tmpStr = @"AG";
tmpStr = [tmpStr stringByAppendingString:(hdgVal)];
dataToSend = [tmpStr dataUsingEncoding:NSUTF8StringEncoding];
[self.serialPort sendData:dataToSend];
j = 0x0d;
dataToSend = [NSData dataWithBytes:&j length:1];
[self.serialPort sendData:dataToSend];
break;
case 5: //RC-2800PX
sendString = @"A#";
sendString = [sendString stringByAppendingString:(hdgVal)];
sendString = [sendString stringByAppendingString:@"\r"];
dataToSend = [sendString dataUsingEncoding:NSUTF8StringEncoding];
[self.serialPort sendData:dataToSend];
break;
case 6: //SARTEK
sendString = @"P";
sendString = [sendString stringByAppendingString:(hdgVal)];
sendString = [sendString stringByAppendingString:@"\r\n"];
dataToSend = [sendString dataUsingEncoding:NSUTF8StringEncoding];
[self.serialPort sendData:dataToSend];
break;
default:
break;
}
Вы устанавливаете 'hgdVal' как строку, но на самом деле он содержит массив. Где ваш код, который устанавливает значение свойства 'hdgVal'? – rmaddy
Я не понимаю, почему он изменяется на массив. Код, добавленный выше, чтобы показать, как он заполнен. – Mike