0

私の Mac アプリは、スクリプトを介して別のアプリから 2 つの文字列値を取得します。特定の条件下で、送信者は「0-1」を提供します。これを検出し、それを表示するテキスト ボックスを空白にする必要があります。次のコードは、2 番目の文字列のコードのみを示しており、デバッガーでは機能しますが、デバッガーの外で実行すると機能しません。

- (void)controlTextDidChange:(NSNotification *)notification
{
// there was a change in a text control
int tmpInt2 = 0;
NSMutableString *tmp2 = [NSMutableString stringWithString:[inputTextField2 stringValue]];
//NSLog(@"text box changed. value: %i", val);
if ([tmp2 length] > 3)
{
    tmp2 = [NSMutableString stringWithString:[tmp2 substringToIndex:[tmp2 length] - 1]];
    [inputTextField2 setStringValue:tmp2];
}
if ([tmp2 length] == 3)
{
    tmpInt2 = [tmp2 intValue];
    if (tmpInt2 > 360 || tmpInt2 < 0 || [tmp2 isEqualToString:@"0-1"])
    {
        //[self showAlert:@"Heading must be between 000 and 360"];
        [inputTextField2 setStringValue:@""];
        //[inputTextField2 setBackgroundColor:[NSColor yellowColor]];
        [tmp2 setString:@""];
    }
}
if ([[inputTextField2 stringValue] rangeOfCharacterFromSet:[[NSCharacterSet decimalDigitCharacterSet] invertedSet]].location != NSNotFound)
{
    NSLog(@"This is not a positive integer");
    //NSMutableString *strippedString = [NSMutableString stringWithCapacity:tmp.length];
    [inputTextField2 setStringValue:@""];
    //[[inputTextField2 cell] setBackgroundColor:[NSColor yellowColor]];
    [tmp2 setString:@""];
}
/*
if ([tmp2 isEqualToString:@"0-1"])
{
    [inputTextField2 setStringValue:@""];
    [tmp2 setString:@""];
}
 */
if ([tmp2 rangeOfString:@"-"].location == NSNotFound) {
    NSLog(@"string does not contain 0-1");
} else {
    NSLog(@"string contains 0-1!");
    [inputTextField2 setStringValue:@""];
    [tmp2 setString:@""];
}

}

4

1 に答える 1

1

NSFormatterまたはその事前定義されたサブクラスの 1 つを使用するという @trojanfoe の提案を調べる必要があります。しかし、あなたは の目的を誤解しているように見えるNSMutableStringので、いくつかのコメントを埋め込んだ次のバージョンのコードを提供します。テストに使用されたテキスト フィールドには、「見出しを入力してください」というプレースホルダー値が与えられ、ARC が有効になっていると想定されています。最新のプロパティ アクセス構文が使用されます (object.property)。HTH。

- (void)controlTextDidChange:(NSNotification *)notification
{
   // there was a change in a text control

   NSTextField *inputTextField = notification.object;   // get the field
   NSTextFieldCell *fieldCell = inputTextField.cell;    // and its cell - we use the placeholder text for feedback in this sample

   fieldCell.placeholderString = @"Enter heading";      // user has typed, restore default message

   NSString *contents = inputTextField.stringValue;     // an NSMutableString is not required, you never mutate this string
   NSUInteger length = contents.length;

   if (length > 3)
   {
      // remove last character - did you mean to truncate to three characters?
      inputTextField.stringValue = [contents substringToIndex:length - 1];
   }
   else if (length == 3)
   {
      int tmpInt = contents.intValue;
      if (tmpInt > 360 || tmpInt < 0 || [contents isEqualToString:@"0-1"])
      {
         fieldCell.placeholderString = @"Heading must be between 000 and 360"; // inform user why field was blanked             
         inputTextField.stringValue = @"";
      }
   }
   else if ([contents rangeOfCharacterFromSet:[[NSCharacterSet decimalDigitCharacterSet] invertedSet]].location != NSNotFound)
   {
      // you might want different logic here
      // if a user types "12Y" you delete everything, deleting just the "Y" might be more friendly
      // ("Y" picked as an example as it could be a miss hit for the 6 or 7 keys)

      fieldCell.placeholderString = @"Enter a positive integer"; // inform user why field was blanked    
      inputTextField.stringValue = @"";
   }
}

補遺 - コメントのフォローアップ

期待している正確な入力と、それらをどうしたいのかは不明です。1 つ目ifは、他のチェックを行わずに、3 より長い文字列から最後の文字を削除するだけです。ただし、ここであなたの意図を誤解している可能性があります。最初ifに処理を続行するつもりでした。たとえば、次のようなものです。

...
   if (length > 3)
   {
      // remove last character - did you mean to truncate to three characters?
      contents = [contents substringToIndex:length - 1];
      length -= 1;
   }

   if (length == 3)
   {
      ...

つまり、入力が 3 文字より長い場合は、最後の文字を削除して (単純に 3 文字に切り捨てたくなかったのでしょうか? その場合は、その 2 行のコードを変更してください)、次のif/に進みますelse

于 2013-10-21T19:51:54.020 に答える