2016-03-03 7 views
0

Я работаю над NSOutlineView, который использует подклассы NSView для создания пользовательских ячеек в контуре. Это я начал работать, НО после того, как 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 - nil (плохо).

Как получить XCode для переноса/завершения заполненного контура (или никогда не выпускать его) и получить daOutline в состоянии, отличном от нуля?

ответ

0

Для тех, кто пришел после этого, возникли две проблемы, которые привели к тому, что розетка NSOutline стала нулевой. Первый из них заключался в том, что при реализации протокола делегата «shareInfoDelegate» я создавал новый экземпляр MainWindowController, а не тот, который содержит данные. У этого нового экземпляра НЕ подключались IBOutlets (или многое из того, что было полезно в нем). Как только я отменил делегат и перешел на использование NSNotification для обновления информации о текстовых полях NSView, моя NSOutline вернулась.

Вторая, более незначительная проблема заключалась в том, что в файле nvi NSView я помещал и NSBox имитировал поведение групповой строки (например, серого фона). В качестве побочного эффекта NSBox ингибировал нормальное поведение выбора строки в контуре. Из-за чего было очень сложно определить, какая строка была выбрана. Когда я удалил NSBox, выбор строки стал намного легче определить.

в частности этот вопрос и ответ Чака были полезны в обнюхивании этого.

Why is my NSOutlineView datasource nil?

Спасибо Действительно (!)

 Смежные вопросы

  • Нет связанных вопросов^_^