2015-03-14 2 views
0

У меня есть NSTableView, основанный на представлении, где все ячейки доступны для редактирования. Мне нужно обновлять данные из модели каждый раз, когда пользователь изменяет textField из представления.Редактировать данные в модели в соответствии с вводом пользователя в NSTableView на основе представления

Весь документ, который я нашел, связан с NSTableView на основе ячеек.

У кого-нибудь есть ключ к этому поводу?

EDIT:

Я использую источник данных для заполнения этой NSTableView.

Это код Контролера NSTableView

class ViewController: NSViewController, NSTableViewDelegate, NSTableViewDataSource { 

@IBOutlet var globalView: NSView! 
@IBOutlet var songsTableView: NSTableView! 

var tableContents = NSMutableArray() 


override func viewDidLoad() { 
    super.viewDidLoad() 

    // Do any additional setup after loading the view. 

    for (song) in songManager.songs { 
     var obj = Dictionary<String,String>() 
     obj["title"] = song.title 
     obj["artist"] = song.artist 
     tableContents.addObject(obj) 
    } 
    songsTableView.reloadData() 
} 


func numberOfRowsInTableView(tableView: NSTableView) -> Int { 
    return tableContents.count 
} 



func tableView(tableView: NSTableView, viewForTableColumn tableColumn: NSTableColumn?, row: Int) -> NSView?{ 

    var obj = tableContents[row] as Dictionary<String,String> 
    let column = tableColumn?.identifier 
    var cellView = tableView.makeViewWithIdentifier(column!, owner: self) as NSTableCellView 

    if column == "title" { 
     cellView.textField?.stringValue = obj["title"]! 
    } 
    if column == "artist" { 
     cellView.textField?.stringValue = obj["artist"]! 
    } 

    cellView.textField?.editable = true 

    return cellView 
}  
} 

И это код класса, который управляет данными.

var songManager = SongManager() 


struct song { 
    var title = "No name" 
    var artist = "No artist" 
} 

class SongManager: NSObject { 

    var songs = [song]() 

    func addSong(title: String, artist: String) { 
     songs.append(song(title: title, artist: artist)) 
    } 

} 

Я не трогали строку, раскадровка создает по умолчанию, так что я предполагаю, что он содержит один NSTextField.

Я получаю, чтобы отображать данные, но не могу определить, когда пользователь попытался изменить текстовое поле.

+0

Нам нужно знать больше. Используете ли вы привязки или источник данных для заполнения представления таблицы? Какова природа элементов в модели данных? Например, с привязками, каковы элементы содержимого контроллера массива? С источником данных вы возвращаетесь из метода '-tableView: objectValueForTableColumn: row:'? Каковы ваши взгляды на ячейки? Используете ли вы 'NSTableCellView' с одним или несколькими subviews? Или вы просто используете 'NSTextField' в качестве прямого представления ячейки? –

+0

Спасибо, что ответили на @KenThomases. Должен ли я предоставить дополнительную информацию? –

ответ

0

Учитывая, как в настоящее время настроены, самый простой подход - это, вероятно, подключение селектора действий текстового поля к методу действий на цели, например, к вашему контроллеру. Вы можете сделать это в IB или в вашем методе tableView(_:viewForTableColumn:row:).

В этом методе действий вы можете позвонить songsTableView.rowForView(sender), чтобы определить, какая строка была отредактирована. В текстовом поле каждого столбца должен быть другой метод действий, например changeTitle() или changeArtist(), чтобы вы знали, какой столбец был отредактирован. (Вы также можете использовать songsTableView.columnForView(sender), а затем получить столбец таблицы с помощью индекса в songsTableView.tableColumns[col] и проверке возвращаемого столбец identifier. Для этого, вы бы присвоить определенные идентификаторы столбцов, а не позволяя IB назначать их автоматически.)

После того, как у вас есть строка, вы просматриваете свой словарь с помощью var obj = tableContents[row] as Dictionary<String,String> и устанавливаете значение для ключа, соответствующего методу действия (или идентификатору столбца), на stringValue отправителя.

+0

Большое спасибо, он, наконец, работает !! –