重新加载NSWindow Xcode Swift2
我正在开发一个NSOutlineView,它使用NSView子类在大纲中生成自定义单元格。这个我已经开始工作了,但是在大纲从模型类中吸取数据并正确显示之后,大纲从内存中释放(?)并变为nil,我还没有找到恢复它的方法 这是MainViewController类重新加载NSWindow Xcode Swift2,swift,nsview,nsoutlineview,nswindowcontroller,Swift,Nsview,Nsoutlineview,Nswindowcontroller,我正在开发一个NSOutlineView,它使用NSView子类在大纲中生成自定义单元格。这个我已经开始工作了,但是在大纲从模型类中吸取数据并正确显示之后,大纲从内存中释放(?)并变为nil,我还没有找到恢复它的方法 这是MainViewController类 class MainWindowController: NSWindowController, ShareInfoDelegate, NSOutlineViewDelegate, NSOutlineViewDataSource {
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
}
}
还有橱窗里的东西
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)并获取我所在的行,并将来自发送方的数据放入模型类的适当部分。这是我在一个标准(1个单元格/1个数据值)大纲中设法实现的。但是在这个原型中,据我所知,MainWindowController已经发布了它的所有内容,而daOutline是零(坏)
如何让XCode重新加载完成的大纲(或从不发布),并将daOutline设置为非nil状态?对于出现导致NSOutline出口变为nil的两个问题之后的用户。第一个是在实现委托协议“shareInfoDelegate”时,我创建了MainWindowController的一个新实例,而不是其中包含数据的实例。这个新实例没有连接IBOutlets(或者没有任何有用的东西)。 一旦我放弃了代理,转而使用NSNotification更新有关NSView文本字段的信息,我的NSOutline就“回来了” 第二个更次要的问题是,在NSView nib文件中,我放置了和NSBox来模拟组行的行为(例如灰色背景)。作为一个副作用,NSBox抑制了大纲的正常行选择行为。这使得很难确定选择了哪一行。当我删除NSBox时,行选择变得更容易确定 特别是这个问题和Chuck的回答有助于发现这一点 真的谢谢(!)