2016-03-03 35 views
0

我正在使用NSView子類在大綱中生成自定義單元格的NSOutlineView。我已經開始工作了,但是在Outline從模型類吸取數據並正確顯示之後,Outline從內存中釋放(?)/變爲零,並且我還沒有想出一種方法來獲取它背部。重新加載NSWindow Xcode Swift2

這裏是MainViewController類

class MainWindowController: NSWindowController, ShareInfoDelegate, NSOutlineViewDelegate, NSOutlineViewDataSource { 

override var windowNibName: String { 

    return "MainWindowController" 

} 

@IBOutlet var daOutline: NSOutlineView! 
// The NSoutline I'm trying to get back to  

一些東西相關的測試數據(略) 帶領我們到NSOutlineViewDataSource東西

//MARK: - NSOutlineViewDataSource 

func outlineView(outlineView: NSOutlineView, child index: Int, ofItem item: AnyObject?) -> AnyObject { 
    if let item: AnyObject = item { 
     switch item { 
     case let work as Work: 
      return work.movements[index] 

     case let movement as Movement: 
      return movement.tracks[index] 

     default: 

      let track = item as! Track 
      return track.credits[index] 
     } 
    } else { 
     if allWorks.count > 0 { 

      return allWorks[index] 
     } 
    } 
    let q = "patience" 
    return q 
} 

func outlineView(outlineView: NSOutlineView, isItemExpandable item: AnyObject) -> Bool { 
    switch item { 
    case let work as Work: 
     return (work.movements.count > 0) ? true : false 

    case let movement as Movement: 
     return (movement.tracks.count > 0) ? true : false 

    case let track as Track: 
     return (track.credits.count > 0) ? true: false 

    default: 
     return false 
    } 
} 

func outlineView(outlineView: NSOutlineView, numberOfChildrenOfItem item: AnyObject?) -> Int { 
    if let item: AnyObject = item { 
     switch item { 
     case let work as Work: 
      return work.movements.count 

     case let movement as Movement: 
      return movement.tracks.count 

     case let track as Track: 
      return track.credits.count 

     default: 
      return 0 
     } 
    } else { 
     return allWorks.count 
    } 
} 



func outlineView(daOutline: NSOutlineView, viewForTableColumn theColumn: NSTableColumn?, item: AnyObject) -> NSView? { 

      switch item { 

     case let worked as Work: 

      let cell = daOutline.makeViewWithIdentifier("newTry", owner:self) as! newTry 

      cell.fourthLabel.stringValue = worked.composer 

      cell.fourthCell.stringValue = worked.title 

      return cell 


     case let moved as Movement: 

      let cell2 = daOutline.makeViewWithIdentifier("SecondTry", owner:self) as! SecondTry 

      cell2.roman.stringValue = moved.name! 

      cell2.details.stringValue = moved.sections! 

      cell2.track.stringValue = "0" 

      return cell2 


     default: 

      print("probably not") 
    } 

    print("not again") 
    return nil 
} 

func outlineView(daOutline: NSOutlineView, heightOfRowByItem item: AnyObject) -> CGFloat { 

    switch item { 

    case let worked as Work: 
     return 40 

    default: 
     return 24 

    }   
} 

而且在WindowDidLoad

override func windowDidLoad() { 
    super.windowDidLoad() 

    let nib = NSNib(nibNamed: "newTry", bundle: NSBundle.mainBundle()) 
    daOutline.registerNib(nib!, forIdentifier: "newTry") 

    let nib2 = NSNib(nibNamed: "SecondTry", bundle: NSBundle.mainBundle()) 
    daOutline.registerNib(nib2!, forIdentifier: "SecondTry") 

    //give Sender it's Receiver 
    mailItOut.delegate = receiver 

    allWorks.append(work1) 
    allWorks.append(work2) 

    work1.movements.append(move1) 
    work1.movements.append(move2) 
    work1.movements.append(move3) 
    work1.movements.append(move4) 

    work2.movements.append(move5) 
    work2.movements.append(move6) 
    work2.movements.append(move7) 

    daOutline.reloadData() 

    daOutline?.expandItem(work1, expandChildren: false) 

    daOutline?.expandItem(work2, expandChildren: false) 
} 
的東西

}

終於newTry的NSView類是什麼樣

class newTry: NSView { 

var delegate: ShareInfoDelegate? 



@IBOutlet weak var fourthCell: NSTextField! 

@IBOutlet weak var fourthLabel: NSTextField! 



@IBAction func cellAdd(sender: NSTextField) { 

    var catchIt: String = String() 



    catchIt = sender.stringValue 

    if catchIt != "" { 
    tryAgain = catchIt 

    whichField = "title" 

    //Trigger the sender to send message to it's Receiver 
    mailItOut.sendMessage() 

    } 
} 

的cellAdd行動來嘗試從文本細胞回覆到模型中獲取用戶輸入。爲此,我(AFAIK)需要訪問NSOutline(daOutline)並獲取我所在的行,並將發件人的數據放入Model類的相應部分。這是我設法在標準(1單元/ 1數據值)大綱中工作的。但在這個原型中,據我所知,MainWindowController已經發布了它的所有內容,而daOutline是零(壞)。

如何讓XCode帶入/重新載入已完成的輪廓(或從不釋放它)並將daOutline轉換爲非零狀態?

回答

0

對於那些後來出現的問題,似乎有兩個問題導致NSOutline outlet成爲零。第一個是在實現委託協議「shareInfoDelegate」時,我創建了一個MainWindowController的新實例,而不是其中的數據。這個新的實例沒有連接IBOutlets(或者大部分有用的東西)。 一旦我放棄委託,並轉移到使用NSNotification更新有關NSView textFields的信息,我的NSOutline出現「回來」。

第二個更小的問題是我放置的NSView nib文件和NSBox模仿組行的行爲(例如灰色背景)。作爲副作用,NSBox禁止了輪廓的正常行選擇行爲。這使得很難確定選擇哪一行。當我刪除NSBox時,行選擇變得更容易確定。

特別是這個問題和查克的回答有助於嗅探出來。

Why is my NSOutlineView datasource nil?

由於事實上(!)