2012-04-10 137 views
0

有沒有人有過在滾動視圖中嵌入字段編輯器(對於NSTextField)的經驗?我試圖在編輯時使NSTextField可滾動。將字段編輯器嵌入到NSScrollView中

事情我已經嘗試:

  1. 動態嵌入它時,自定義字段編輯器的-becomeFirstResponder被調用。這半工作;問題是,當的NSTextField編輯自定義字段編輯器不再被它調整期間被調整(我需要這個 - 使手風琴 風格的應用程序)

  2. 創建一個「僞裝」字段編輯器了NSScrollView的,並使用NSInvocation將這些方法轉發給實際的代理字段編輯器。這是我真正希望能夠工作的方法;我已經實施了列出的所有方法here;但每當實際加載字段編輯器時(例如當我撥打[customTextField selectText:nil]時),我會得到一個EXC_BAD_ACCESS。即使啓用了Zombies,我似乎也無法從調試器中撬出任何信息,並且查看NSObjCMessageLoggingEnabled的日誌也不會產生任何結果。似乎these guys得到它的工作,但那是七年前。

最後的手段是完全刪除NSTextFields和使用NSTextViews(或而不是依賴於字段編輯器機制,寫一個自己),但因爲我有很多行數據的其中只有一個將被編輯一次,我不想爲它們中的每一個實例化一個NSTextView ......但是,也許它不會那麼糟糕。

回答

0

我結束了使用選項1,並得到它沒有太大困難的工作。選項2是一個完全死衚衕,因爲我去的每個地方都彈出了EXC_BAD_ACCESS

我的自定義字段編輯器現在保留對(自定義)滾動視圖的引用,以將其自身嵌入(vvScrollView)中,並將其插入到視圖層次結構中。我的我的自定義字段編輯器(NSTextView)內部代碼嵌入它滾動視圖,這是儘快稱爲字段編輯器內成爲第一個響應並自動插入到視圖層次:

- (void)embedSelfInScrollView { 
    NSView *realSuperview = [[self superview] superview]; 
    // [self superview] is some kind of private NSClipView class 
    if ([realSuperview isKindOfClass:[NSTextField class]]) { // the expected behavior: this may change? TODO make less prone to chance 
     [realSuperview addSubview:[self vvScrollView]]; // insert into view 
     [[self vvScrollView] setFrameSize:[realSuperview frame].size]; // se the initial size equivalent to control size so it can autoresize the same way 
     // add the scrollview into the view hierarchy 
     [[self vvScrollView] setDocumentView:self]; // removes self from previous superview 
    } 
} 

最初的問題我原因是我試圖將scrollview插入緊靠字段編輯器(NSClipView的私有類)上方的superview中,這幾乎破壞了每個自動調整選項(因爲我希望能夠在編輯時調整NSTextField的大小)。進一步繞過私人課程似乎有效,但幾乎看起來是任意的。