2016-12-16 14 views
1

カスタムビュー(UITableViewCell)を使用してリスト(UITableView)を作成し、追加ボタン(リストの外にある)をクリックすると、ユーザーのデータを受け取り、 )、新しいユーザーのカスタムビューがリストに追加され、別のユーザーの詳細を入力できます。 私はtableViewでカスタムビューを作成する方法を知っています 私はtableViewに追加する方法を知っていますが、そのテキストだけですが、tableviewに追加したいものはボタンをクリックするとcustomViewになります。カスタムUITableViewCellを動的に追加する

tableViewにテキストを追加するには、以下のようにしました。

datas.insert("new data", at: 0) 
     jobTableView.beginUpdates() 
     jobTableView.insertRows(at: [IndexPath.init(row: 0, section: 0)], with: .automatic) 
     jobTableView.endUpdates() 

カスタムビューではどのようにしますか?

以下

が私のテーブルビューで

UITableviewClass

public class MiddlePartCell: BaseCell, UITableViewDelegate, UITableViewDataSource { 

let tableCell = "tableCell" 

lazy var jobTableView: UITableView = { 
    let tv = UITableView() 
    tv.backgroundColor = .brown 
    tv.dataSource = self 
    tv.delegate = self 
    return tv 
}() 

lazy var addMoreButton: UIButton = { 
    let button = UIButton(type: .system) 
    button.setBackgroundImage(UIImage(named: "plus"), for: .normal) 
    button.tintColor = .black 
    button.addTarget(self, action: #selector(handleAddJob), for: .touchUpInside) 
    button.layer.cornerRadius = 20 
    return button 
}() 

@objc private func handleAddJob(){ 
    //what should i do here 
    //i need to insert the custom view to the top index 
    jobTableView.beginUpdates() 
    jobTableView.insertRows(at: [IndexPath.init(row: 0, section: 0)], with: .automatic) 
    jobTableView.endUpdates() 
} 

override func setupView() { 
    super.setupView() 
    backgroundColor = .green 
    addSubview(jobTableView) 
    addSubview(addMoreButton) 

    jobTableView.register(UITableViewCell.self, forCellReuseIdentifier: tableCell) 

    _ = addMoreButton.anchor(nil, left: leftAnchor, bottom: bottomAnchor, right: nil, topConstant: 0, leftConstant: 10, bottomConstant: 10, rightConstant: 0, widthConstant: 50, heightConstant: 50) 

    _ = jobTableView.anchor(topAnchor, left: leftAnchor, bottom: addMoreButton.topAnchor, right: rightAnchor, topConstant: 0, leftConstant: 0, bottomConstant: 0, rightConstant: 0, widthConstant: frame.width, heightConstant: frame.height) 
} 

public func numberOfSections(in tableView: UITableView) -> Int { 
    return 1 
} 

public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: tableCell, for: indexPath) 

    cell.textLabel?.text = datas[indexPath.item] 

    return cell 
} 

public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return datas.count 
    } 
} 
+0

あなたのhandleAddJob関数でもデータソース配列に挿入する必要があります。 – koropok

+0

@ koropokどのように新しいカスタムビューをテーブルビューに追加することができます – SimpiMind

+0

カスタムビューでは、新しいUITableViewCellを意味しますか?私はあなたの質問を理解できるかどうか分からない。 – koropok

答えて

1

まず、あなたはのUITextFieldとUITableViewCellのためのUITableViewCellのサブクラスを作成する必要があります。もちろん、cellForRowAtデリゲート関数内にUITextFieldを追加することはできますが、私はカスタムUITableViewCellでそれを行うことを好みます。

class UITableViewCellWithTextField: UITableViewCell { 

    var textField: UITextField! 

    override init(style: UITableViewCellStyle, reuseIdentifier: String?) { 

     super.init(style: style, reuseIdentifier: reuseIdentifier) 
     setup() 
    } 

    func setup() { 

     let textField = UITextField(frame: self.contentView.frame) 
     self.contentView.addSubview(self.textField) 
    } 
} 

次に、このカスタムUITableViewCellをUITableViewに登録する必要があります。これを既存のUITableViewCell登録コード行に追加します。

jobTableView.register(UITableViewCell.self, forCellReuseIdentifier: tableCell) 
jobTableView.register(UITableViewCellWithTextField.self, forCellReuseIdentifier: "TextFieldCell") 

次のステップは、ユーザーが新しいジョブの追加機能を開始したことを示す変数を宣言することです。

public class MiddlePartCell: BaseCell, UITableViewDelegate, UITableViewDataSource { 

    var isHandlingAddJob = false 

    ... 
} 

その後、あなたのhandleAddJob機能で

func handleAddJob(){ 

    self.isHandlingAddJob = true 
    datas.insert("new data", at: 0) 
    jobTableView.beginUpdates() 
    jobTableView.insertRows(at: [IndexPath.init(row: 0, section: 0)], with: .automatic) 
    jobTableView.endUpdates() 
} 

最後のUITableViewは、新しいジョブの追加処理するために、入ってくる新しいセルことを知って、カスタムテキストフィールドのセルを使用する必要があるようにすることです。

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 

    if indexPath.row == 0 && self.isHandlingAddJob { 

     // Handling new job cell 
     let cell = tableView.dequeueReusableCell(withIdentifier: "TextFieldCell", for: indexPath) as! UITableViewCellWithTextField 
     return cell 
    } 

    let cell = tableView.dequeueReusableCell(withIdentifier: tableCell, for: indexPath) 

    cell.textLabel?.text = datas[indexPath.item] 
    return cell 
} 

P.S.私はあなたの質問を正しく理解していますか?

カスタムテーブルビューセルでテキストフィールドのデータを保持するには、デリゲートパターンを使用する必要があります。まず、カスタムテーブルビューセルまたはMiddlePartCellクラスをUITextFieldDelegateに準拠させる必要があります。私は後者のために行くつもりです。

class MiddlePartCell: BaseCell, UITableViewDelegate, UITableViewDataSource, UITextFieldDelegate { 

    ... 
} 

次に、cellForRowAt関数で、カスタムセルのテキストフィールド代理人をMiddlePartCellに設定します。

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 

    if indexPath.row == 0 && self.isHandlingAddJob { 

     // Handling new job cell 
     let cell = tableView.dequeueReusableCell(withIdentifier: "TextFieldCell", for: indexPath) as! UITableViewCellWithTextField 
     cell.returnKeyType = .Done 
     cell.textField.delegate = self 
     return cell 
    } 

    ... 
} 

最後に、UITextFieldDelegate関数を使用します。キーボードでの使用をクリックすると、セルはUITextFieldのない通常のUITableViewCellにリロードされます。

func textFieldShouldReturn(textField: UITextField) -> Bool { 

    self.isHandlingAddJob = false 
    self.datas.first! = textField.text! 
    self.jobTableView.reloadRowsAtIndexPaths([NSIndexPath(forRow: 0, inSection: 0)], withRowAnimation: .Automatic) 
    return true 
} 
+0

私はそれを試してみましょう – SimpiMind

+0

これは機能しますが、どのように各セルに入力されたものを追跡することができますか? – SimpiMind

+0

私はちょっと混乱しているかもしれないと思うのですが、customviewは入力フィールドだけでなく、また、私はそれを見直して、それがまだ軌道に乗っていることを望みました。 – SimpiMind

関連する問題