首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重新加载NSWindow Xcode Swift2

重新加载NSWindow Xcode Swift2
EN

Stack Overflow用户
提问于 2016-03-04 02:13:19
回答 1查看 195关注 0票数 0

我正在开发一个使用NSView子类在大纲中生成自定义单元格的NSOutlineView。我已经开始工作了,但是在大纲从模型类中吸收数据并正确显示之后,大纲就被释放了(?)从memory /到nil,我还没有想出一种方法来找回它。

下面是MainViewController类

代码语言:javascript
复制
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内容

代码语言:javascript
复制
//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中的东西

代码语言:javascript
复制
    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类的样子

代码语言:javascript
复制
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状态?

EN

回答 1

Stack Overflow用户

发布于 2016-03-17 22:01:01

对于那些后来居上的人来说,似乎有两个问题导致NSOutline插座变成了零。第一个问题是,在实现委托协议"shareInfoDelegate“时,我创建了一个新的MainWindowController实例,而不是其中包含数据的实例。这个新的实例没有连接IBOutlets (或者没有任何有用的东西)。一旦我放弃了委托,转而使用NSNotification来更新关于NSView textFields的信息,我的NSOutline就“回来了”。

第二个更小的问题是,在我放置的NSView nib文件中,使用NSBox来模拟组行的行为(例如灰色背景)。作为一个副作用,NSBox抑制了大纲的正常行选择行为。这使得很难确定选择了哪一行。当我删除NSBox时,行选择变得更加容易确定。

特别是,这个问题和Chuck的答案有助于嗅探出这一点。

Why is my NSOutlineView datasource nil?

真的非常感谢(!)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35779840

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档