2016-03-03 55 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?

由于事实上(!)