2017-01-23 4 views
0

У меня есть NSTableView с данными, заполненными из массива.Удалить данные из массива в NSTableView с NSButton с Swift

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

Я борюсь с тем, как вы удаляете данные из массива и удаляете столбец таблицы?

Моя ссылка массив:

var messagesRef: Firebase! 
var messages = [Message]() 

func setupFirebase() { 

    messagesRef = Firebase(url: "https://url") 


    messagesRef.queryLimitedToLast(10).observeEventType(FEventType.ChildAdded, withBlock: { (snapshot) in 
     let text = snapshot.value["text"] as? String 
     let sender = snapshot.value["sender"] as? String 
     let imageUrl = snapshot.value["imageUrl"] as? String 

     let message = Message(text: text, sender: sender, imageUrl: imageUrl) 
     self.messages.append(message) 
     self.tableView.reloadData() 


    }) 
} 

и мой стол делегат и источник данных:

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

func tableView(tableView: NSTableView, viewForTableColumn tableColumn: NSTableColumn?, row: Int) -> NSView? { 
    let result = tableView.makeViewWithIdentifier("cell", owner: self) as? secondviewTableCell 



    let mess = messages[row] 

    result?.textField?.stringValue = mess.text() 
    result?.sendertextView.stringValue = mess.sender() 

    result?.removeButton.target = self 
    result?.removeButton.action = #selector(secondVC.removeFromScreen) 



    return result 

} 

func removeFromScreen(){ 


    } 

мне удалось удалить строку в TableView, но я до сих пор борется с удалением данные из строки в массиве.

Вот моя функция, чтобы удалить строку:

@IBAction func removetablerow(object: NSButton) { 

    let row = tableView.rowForView(object as NSView) 
    if (row > -1) { 
     let indexSet = NSIndexSet(index:row) 
     tableView.removeRowsAtIndexes(indexSet, withAnimation: NSTableViewAnimationOptions.EffectFade) 
     NSTimer.scheduledTimerWithTimeInterval(0.5, target: self, selector: #selector(secondVC.rowDeleted(_:)), userInfo: row, repeats: false) 


    } 
} 

ответ

1

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

  • Создайте стандарт IBAction и подключите его в Interface Builder.
  • В действии получить строку с row(for view: и передать sender как view параметр, например.

    @IBAction func removeFromScreen(_ sender : NSButton) 
    { 
        let row = self.tableView.row(for: sender) 
        messages.remove(at:row) 
        tableView.removeRows(at: IndexSet(integer:row), withAnimation:.effectFade) 
        // do other things with the row 
    } 
    

Никаких дополнительных target, никаких дополнительных action.

Edit:

Свифта 2 эквивалента:

@IBAction func removeFromScreen(sender : NSButton) 
    { 
     let row = tableView.rowForView(object) 
     messages.removeAtIndex(row) 
     tableView.removeRowsAtIndexes(NSIndexSet(index:row), withAnimation: NSTableViewAnimationOptions.EffectFade) 
     // do other things with the row 
    } 
+0

Я получаю ошибку обратно из значения типа 'NSTableView' не имеет 'ряд' члена с этим ответом. –

+0

Извините, это код Swift 3 и, видимо, вы используете Swift 2. Вам нужно также удалить элемент из массива 'messages'. – vadian

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