2015-08-07 2 views
41

Я работаю над проектом, где у меня есть два UITableView с и два UITextField с, когда пользователь нажимает на кнопку данные в первом textField должны идти в tableView и второй перейдите во второй tableView. Моя проблема в том, что я не знаю, как помещать данные в tableView каждый раз, когда пользователь нажимает кнопку, я знаю, как вставлять данные с tableView:cellForRowAtIndexPath:, но это работает один раз, насколько я знаю. Итак, какой метод я могу использовать для обновления tableView каждый раз, когда пользователь нажимает кнопку?Как вставить новую ячейку в UITableView в Swift

+0

Что вы пробовали? Вы говорите: «tableView: cellForRowAtIndexPath:» работает только «насколько известно». Почему бы не попробовать его в методе вашей кнопки? –

+1

@Max von Hippel что я сделал: tableView берет данные из массива , поэтому, когда я добавляю элемент в массив, я использую этот метод: tableView.reloadData таким образом, когда когда-либо добавляю элемент, массив будет перейдите в «CellForRowAtIndexPath» и снова извлеките информацию из массива :) –

ответ

100

Использование beginUpdates и endUpdates для вставки новой ячейки, когда кнопка нажата ..

Прежде всего добавить данные в массиве Tableview

Yourarray.append([labeltext]) 

Затем upate таблицу и вставить новую строку

// Update Table Data 
    tblname.beginUpdates() 
    tblname.insertRowsAtIndexPaths([ 
     NSIndexPath(forRow: Yourarray.count-1, inSection: 0) 
     ], withRowAnimation: .Automatic) 
    tblname.endUpdates() 

Вставляет ячейку и не нужно перезагружать всю таблицу, но если у вас возникли проблемы с этим, вы также можете использовать tableview.reloadData()


быстры 3,0

tableView.beginUpdates() 
tableView.insertRows(at: [IndexPath(row: yourArray.count-1, section: 0)], with: .automatic) 
tableView.endUpdates() 

Objective-C

[self.tblname beginUpdates]; 
NSArray *arr = [NSArray arrayWithObject:[NSIndexPath indexPathForRow:Yourarray.count-1 inSection:0]]; 
[self.tblname insertRowsAtIndexPaths:arr withRowAnimation:UITableViewRowAnimationAutomatic]; 
[self.tblname endUpdates]; 
+3

Приятно, что вы предоставили версию Objective-C. Иногда это помогает! –

+1

@RashmiRanjanmallick ... да же я подумал и отредактировал свой ответ ... поэтому люди понимают переводы :) –

+5

'begin/endUpdates' не влияет ни на одну операцию вставки/удаления/перемещения. – vadian

19

Вот код для добавления данных в обоих Tableview:

import UIKit 

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 

    @IBOutlet weak var table1Text: UITextField! 
    @IBOutlet weak var table2Text: UITextField! 
    @IBOutlet weak var table1: UITableView! 
    @IBOutlet weak var table2: UITableView! 

    var table1Data = ["a"] 
    var table2Data = ["1"] 

    override func viewDidLoad() { 
     super.viewDidLoad() 

    } 

    @IBAction func addData(sender: AnyObject) { 

     //add your data into tables array from textField 
     table1Data.append(table1Text.text) 
     table2Data.append(table2Text.text) 

     dispatch_async(dispatch_get_main_queue(), {() -> Void in 
      //reload your tableView 
      self.table1.reloadData() 
      self.table2.reloadData() 
     }) 


     table1Text.resignFirstResponder() 
     table2Text.resignFirstResponder() 
    } 

    //delegate methods 
    func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
     return 1 
    } 
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     if tableView == table1 { 
      return table1Data.count 
     }else if tableView == table2 { 
      return table2Data.count 
     } 
     return Int() 
    } 

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

     if tableView == table1 { 
      let cell = table1.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! UITableViewCell 

      let row = indexPath.row 
      cell.textLabel?.text = table1Data[row] 

      return cell 
     }else if tableView == table2 { 

      let cell = table2.dequeueReusableCellWithIdentifier("Cell1", forIndexPath: indexPath) as! UITableViewCell 

      let row = indexPath.row 
      cell.textLabel?.text = table2Data[row] 

      return cell 
     } 

     return UITableViewCell() 
    } 
} 

И ваш результат будет:

enter image description here

+0

Как раскладушка выкладывалась для этого? – Sami

+0

Причина, по которой я спрашиваю, заключается в том, что я пытаюсь сделать что-то подобное, и я получаю сообщение на консоли, которое говорит мне, что tableview вынуждено изменять размер. – Sami

+0

Это очень помогло. Спасибо. –

11

Swift 3,0 Обновлено решение

Вставка в нижней

self.yourArray.append(msg) 

self.tblView.beginUpdates() 
self.tblView.insertRows(at: [IndexPath.init(row: self.yourArray.count-1, section: 0)], with: .automatic) 
self.tblView.endUpdates() 

Вставить в верх TableView

self.yourArray.insert(msg, at: 0) 
self.tblView.beginUpdates() 
self.tblView.insertRows(at: [IndexPath.init(row: 0, section: 0)], with: .automatic) 
self.tblView.endUpdates() 
+0

Как это достигается с помощью коллекции? Я могу легко вставить несколько элементов ... но это вставка в индекс 0. Когда элемент выбран, отображается предыдущий индекс 0. – scrainie