2010-01-15 17 views
1

我有一個非常標準的設置,我在我的控制器中有一個數組,我綁定到NSTableView。當我用UI添加一個對象到這個數組時,我通過將數組複製到一個可變數組中添加元素,然後將其複製回來。我在某處看到了這個習語,但我不確定它在哪裏,或者這是否確實是一種理智的事情。我在Snow Leopard上工作得很好,但它在Leopard上非常糟糕。 GDB告訴我,它發生在標記行,我將新陣列複製回來。我正在更新綁定到NSTableView的NSArray嗎?

@interface MyAppDelegate : NSObject { 

    NSArray * urls; 
    //other declarations 
} 
@property (nonatomic, retain) NSArray *urls; 


@implementation MyAppDelegate 

@synthesize urls; 

- (void)addThing:(id)sender { 

    NSMutableArray *newUrls = [NSMutableArray arrayWithArray: [self urls]]; 

    [newUrls addObject: newurlimadding]; 
    [self setUrls: [NSArray arrayWithArray: newUrl]]; 
} 

我很確定我必須在這裏做些什麼。有一個更好的方法嗎?我爲什麼崩潰?

回答

1
NSMutableArray *newUrls = [NSMutableArray arrayWithArray: [self urls]]; 
[newUrls addObject: newurlimadding]; 
[self setUrls: [NSArray arrayWithArray: newUrl]]; 

那你創建newUrls因爲如果不將其設置爲urls新的價值?

除此之外,還有你在做兩件事情錯了:

  1. 沒有模型對象。綁定討厭這個。除非您的表視圖僅用於顯示URL的不同部分(方案,主機,路徑等),並且每個列都包含在一個列中,否則您不會給Bindings任何想要的東西。

    請注意綁定檢查器中的字段。請注意,有兩個:控制器密鑰和模型密鑰路徑。它們正是他們在罐子上說的:控制器鍵是控制器屬性的關鍵,它應該提供模型對象。模型關鍵路徑是模型中一個或多個屬性的關鍵路徑,通常應提供值對象,如字符串和數字。

    您可能需要創建一個模型類並將該URL作爲該類的一個屬性。我猜想你有其他的對象,可能是並行數組,你可以移動到模型類的屬性。這樣做,以便你工作綁定而不是反對它。

  2. 不使用數組訪問器。您只是一次設置整個陣列,效率低下,可能會導致顯示問題(如選擇亮點消失)。爲此數組屬性實現並使用array accessorsAccessorizer可以幫助你在這裏。

我實際上不知道這是否會解決你的崩潰,因爲你沒有告訴我們任何關於它的事情。您應該編輯問題以包含任何異常消息或其他崩潰描述輸出,您可以在運行日誌/調試器控制檯中找到該輸出。

此外,由於urls的類型可以是可變的,因此您應將其設置爲copy而不是retain

+0

其實,我的tableview * does *只有一列,只顯示一個URL的路徑。我將該列綁定到NSURL對象中的路徑鍵。這個NSURL數組只是坐在我的控制器對象中,它可能屬於我的模型。如果我只想在一個表列中顯示路徑鍵,那麼將綁定直接指向NSURL數組有什麼問題嗎?它在10.6「有效」。 我知道可能有更好的方法添加到數組中。謝謝。我將通讀「模型對象實施指南」。 – oldpatricka

+0

此外,我不知道我可以發佈關於崩潰的有用信息,因爲錯誤控制檯只是給了我樣板「gdb is starting」文本(http://pastie.org/784091)和調試器只是將我指向我導致崩潰的地方。 http://i.imgur.com/hxcwi.png – oldpatricka

+0

查看調試器窗口中的幀號列。那至少有四位數字!你可能有一個遞歸問題。看起來更高一點,看看週期是什麼。 –

0

NSArray * things; - 因爲這可以被修改,所以最好使用NSMutableArray來代替NSArray。

當您需要添加一些新元素到列表中時,只需使用'addObject'並將元素插入列表。

您的綁定將確保使用KVO和KVC更新UI。

+0

這似乎沒有解決問題。當我添加我的新對象時,我仍然崩潰。 – oldpatricka

+0

您是否在MyAppDelegate - > init方法中創建了數組對象?確保在向NSMutableArray的對象插入元素之前,創建數組。 –

0

它看起來像問題是我有NSURLs作爲我的對象類型。一旦我將數組中的對象更改爲一個定製的符合KVC的對象,我就不會再發生崩潰。

也許NSURL在10.5上不符合KVC標準,但它在10.6上?