2

私はOSXのCocoaでコーディングしています。

NSViewサブクラスにドラッグアンドドロップされたファイルを受信しようとしています。これは可能です。その内容とファイル名を取得して表示します。これは、最初はどのタイプのファイルでも実行できますが、2回目は、別のファイルをドラッグしようとすると、タイトルのみを設定できますが、setTitle:本文は設定できません。setText:

私が得ているエラーは次のとおりです。

ドラッグセッション中に例外'NSInternalInconsistencyException'(理由'無効なパラメーターが満たされない:aString!= nil')が発生したため、ドラッグをキャンセルしました

-[NSTextFieldCell _objectValue:forString:errorDescription:]、/ SourceCache / AppKit / AppKit-1187 / AppKit.subproj / NSCell.m:1532でのアサーションの失敗

私のコード(申し訳ありませんが、かなり長いです!):

- (BOOL)performDragOperation:(id<NSDraggingInfo>)sender {
NSPasteboard *pboard;
NSDragOperation sourceDragMask;

sourceDragMask = [sender draggingSourceOperationMask];
pboard = [sender draggingPasteboard];

if ([[pboard types] containsObject:NSFilenamesPboardType]) {

    NSURL *file = [NSURL URLFromPasteboard:pboard];
    //NSData *data = [NSData dataWithContentsOfURL:file];

    NSError *error;
    NSStringEncoding encoding;
    NSString *contentString = [[NSString alloc] initWithContentsOfURL:file usedEncoding:&encoding error:&error];

    NSLog(@"Error: %@",error);

    NSString *last = [[file path] lastPathComponent];
    NSArray *parts = [last componentsSeparatedByString:@"."];
    NSString *filename = [parts objectAtIndex:0];
    NSString *fileType = [parts objectAtIndex:1];

    NSLog(@"FILETYPE: %@", fileType);

    if ([fileType isEqualToString:@"txt"] || [fileType isEqualToString:@"md"]) {
        [self setTitle:filename];

        if (self.textViewString == (id)[NSNull null] || self.textViewString.length == 0) {
            [self setText:contentString];
        } else {
            BOOL whatToDo = (NSRunCriticalAlertPanel(@"What do you want to do?", nil, @"Append", @"Replace", nil) == NSAlertDefaultReturn);

            if (whatToDo) {
                //Append
                [self setText:[NSString stringWithFormat:@"%@\n%@",self.textViewString,contentString]];
            } else {
                //Replace
                [self setText:contentString];
            }
        }
        return YES;
    } else {
        return NO;
    }
} else if ([[pboard types] containsObject:NSPasteboardTypeString]) {
    NSString *draggedString = [pboard stringForType:NSPasteboardTypeString];

    if (self.textViewString == (id)[NSNull null] || self.textViewString.length == 0) {
        [self setText:draggedString];
    } else {
        [self setText:[NSString stringWithFormat:@"%@\n%@",self.textViewString,draggedString]];
    }
    return YES;
}
else {
    return NO;
}

}

前もって感謝します!:)

4

2 に答える 2

2

例外が発生したときに Cocoa がドラッグをキャンセルしているように聞こえます。また、内部で何かが文字列を予期していて、nil代わりに値を取得しているときに例外が発生しています。

それ以上の情報がないのは単なる推測ですがstringWithFormat:、あなたが書いたものの唯一の潜在的に壊れやすいビットのように見えるので、例外が発生していると私は予測します.

あなたはいくつかの賢明でないことをしています。-initWithContentsOfURL:usedEncoding:error:まず、それが成功していると仮定しています。これを行うべきではありません。代わりに、NSError **エラー時に入力できる an を渡し、 nil かどうかをテストし、contentStringnil の場合はそれに応じて をチェックする必要がありerrorます。私はあなたがあなたが得ていることに気付くだろうと感じていますnil, そしてそのerror理由を説明します.

おそらく無関係ですが、あなたif (whatToDo)はおそらくあなたが思っていることをしていません. whatToDoは自動解放されたNSNumberインスタンスへのポインターであるため、ポインターはゼロではないため、条件は常にtrue評価されます。あなたがするつもりだったのは、おそらく次のようなものでした:

 BOOL whatToDo = (NSRunCriticalAlertPanel(@"What do you want to do?", nil, @"Append", @"Replace", nil) == NSAlertDefaultReturn);

    if (whatToDo) {
        //Append
        [self setText:[NSString stringWithFormat:@"%@\n%@",self.textViewString,contentString]];
    } else {
        //Replace

        [self setText:contentString];
    }
于 2012-07-28T21:15:04.050 に答える
0

コンラッド・シュルツによるこの回答からの多くのヒントとアドバイスに感謝します! 私はそこでのアドバイスとヒントに従いました。

しかし、私の問題は非常に基本的なものであることが判明しました。それは一列に並んでいたBOOL whatToDo = (NSRunCriticalAlertPanel(@"What do you want to do?", nil, @"Append", @"Replace", nil) == NSAlertDefaultReturn);

2 番目のパラメーターに文字列を渡す必要nilがあることがわかりましたが、渡していました。修理済み!

于 2012-07-29T12:56:41.247 に答える