Ячейка прототипа tableView с кнопкой действия вне tableView

Я начинаю разработку мобильных приложений на Swift. Я разработал форму в viewController, используя ячейки прототипа tableView (не используя UITableViewController и статические ячейки, поскольку мне нужно разместить другие элементы управления в контроллере представления).

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

class VehicleTableViewCell: UITableViewCell {


@IBOutlet var txtModel: UITextField!
//@IBOutlet weak var txtModel: UITextField!
@IBOutlet weak var txtODO: UITextField!
@IBOutlet weak var txtFuel1: UITextField!
@IBOutlet weak var txtFuel2: UITextField!

@IBOutlet weak var lblDistanceUnit: UILabel!
@IBOutlet weak var lblFuel2Unit: UILabel!
@IBOutlet weak var lblFuel1Unit: UILabel!
@IBOutlet weak var lblMake: UILabel!
@IBOutlet weak var lblFuelType: UILabel!
@IBOutlet weak var lblCurrency: UILabel!

override func awakeFromNib() {
    super.awakeFromNib()
    // Initialization code
}

override func setSelected(selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)

    // Configure the view for the selected state
}}

Вот мой UIViewController, который делает обычные вещи:

class ViewController: UIViewController,  UITableViewDataSource, UITableViewDelegate,UISearchBarDelegate {

@IBOutlet weak var tableView: UITableView!

// Array of cell identifiers
let cellArray = ["CellMake", "CellModel", "CellODO", "CellFuelType", "CellFuel1", "CellFuel2", "CellCurrency"]


override func viewDidLoad() {
    super.viewDidLoad()
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}

func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return 1
}

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return cellArray.count
}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
{
    let cell = tableView.dequeueReusableCellWithIdentifier(cellArray[indexPath.row]) as! VehicleTableViewCell
    if indexPath.row == 1
    {
        cell.txtModel.addTarget(self, action: "txtModelChanged:", forControlEvents: UIControlEvents.TouchUpInside)

        println("Inside index row 1")
    }

    return cell        
}

@IBAction func txtModelChanged(sender: UITextField!)
{
    println("test")
}}

Вот несколько вещей, которые я смущен и не могу продолжить.

  1. Я добавил цель для txtModel в cellForRowAtIndexPath и сопоставил ее с функцией txtModelChanged в событии touchUpInside. Просто он не запускал функцию и не выдавал никаких ошибок. Есть предположения, в чем может быть дело?

  2. Я пытаюсь получить значения всех объектов при нажатии кнопки «Готово». Как пройти через tableView, чтобы получить все значения?

  3. Есть ли другой лучший способ добиться того же?


person Arul Kumar    schedule 19.05.2015    source источник


Ответы (2)


Первый

Если вы хотите запустить какой-либо метод, когда пользователь касается вашего UITextField, вы должны переопределить метод делегата текстового поля textFieldDidBeginEditing и вызвать ответчик первого ответа, чтобы избежать клавиатуры, а затем написать свой собственный код или вызовы методов.

Взято из: https://stackoverflow.com/a/4919134/2210926

В этом конкретном вопросе не важно, используете ли вы Swift или Obj-C.

Второй

Это не вариант, у вас нет гарантии, что все ваши ячейки будут живы в этот момент. Вам нужно где-то хранить все эти данные, например, в массиве.

person mMaxy    schedule 19.05.2015

Для разработки общей формы я нашел очень полезным https://github.com/escoz/QuickDialog. Я использовал его в одном из моих приложений. Если вы хотите реализовать свою собственную логику, я думаю, что этот пример поможет вам вывести информацию.

person Gajendra Mali    schedule 19.05.2015