2012-07-28 64 views
2

我編碼可可,在OS X上的NSView拖動操作錯誤

我想收到拖放到我的NSView子文件 - 這是我能夠做到; 得到它的內容和文件名並顯示它們 - 我可以爲任何類型的文件做第一次,但第二次,當我嘗試拖動另一個文件時,我只能設置標題setTitle:,但不是主體文本setText:

我得到的錯誤是:

取消阻力,因爲異常「NSInternalInconsistencyException」(理性「無效的參數並不令人滿意:ASTRING =零」)的募集一個dragg期間荷蘭國際集團會話

斷言故障 - [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; 
} 

}

提前感謝! :)

回答

0

很多感謝來自this answer by Conrad Shultz建議的許多技巧滴滴!我跟着建議和提示那裏。

但是,我的問題原來是非常非常基本的。它謊稱在該行BOOL whatToDo = (NSRunCriticalAlertPanel(@"What do you want to do?", nil, @"Append", @"Replace", nil) == NSAlertDefaultReturn);

原來的字符串必須傳遞給第二個參數,但我經過nil。固定!

2

聽起來像可可正在取消拖動,當引發任何異常,並且當內部預期字符串並且獲取nil值時引發異常。

這只是一個猜測,沒有更多的信息,但我會預測stringWithFormat:會引發異常,因爲它看起來像是你寫的內容中唯一真正可能脆弱的位。

你正在做一些不明智的事情。首先,我們假定你是那個-initWithContentsOfURL:usedEncoding:error:正在取得成功。你不應該這樣做。相反,你需要傳遞一個NSError **可以在錯誤填寫,contentString測試是否爲零,並且,如果是的話,相應的檢查error。我有一種感覺,你會發現你越來越nil,和error會解釋爲什麼。

可能不相關,但你的if (whatToDo)沒有做你可能認爲的事情。由於whatToDo是指向自動發佈的NSNumber實例的指針,因此總是評估爲真,因爲指針非零。你可能打算做的是類似以下內容:

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]; 
    } 
+0

非常感謝,whatToDo細分正是我的意思,我沒有意識到。我傳入一個NSError和NSLogged它,但它出現爲「(null)」,所以我認爲沒有錯。我現在得到的行爲是現在讀取和顯示任何文件,但如果我再次嘗試使用任何文件,它會失敗,NSLogs「 - NSTextFieldCell _objectValue:forString:errorDescription:/ SourceCache/AppKit/AppKit -1187/AppKit.subproj/NSCell.m:1532「 – 2012-07-28 21:37:09

+0

我已經更新了我的原始問題。 – 2012-07-28 21:42:06

+0

你可以發佈你的更新的代碼,包括'NSError'的變化和修復'whatToDo'?要確保我們在同一頁面上。 – 2012-07-28 21:45:43