2016-12-04 12 views
0

これは、UITableViewCellクラスからUIViewControllerクラスにデータを転送することです。以下は私のUITableViewCellです:UITableViewCellのココアタッチクラスからUIViewControllerクラスへのデータの転送

class OrderCell: UITableViewCell { 

override func awakeFromNib() { 
    super.awakeFromNib() 

} 

var post: OrderModel! 
var link: Link! 

var addedList: [String:Float] = [:] 


@IBOutlet weak var dishName: UILabel! 
@IBOutlet weak var dishDescriptionAndPrice: UILabel! 
@IBOutlet weak var numberOfOrders: UILabel! 
@IBOutlet weak var addOrderBtn: UIButton! 
@IBOutlet weak var subtractOderBtn: UIButton! 

@IBAction func addButtonPressed(sender: AnyObject) { 
    if numberOfOrders.text == "9" { 
     numberOfOrders.text = "9" 
    } else { 
     numberOfOrders.text = String((Int(numberOfOrders.text!)! + 1)) 
    } 
    addedList.updateValue(post.dishPrice, forKey: post.dishName) 
    print(addedList) 
} 

@IBAction func subtractButtonPressed(sender: AnyObject) { 
    if numberOfOrders.text == "0" { 
     numberOfOrders.text = "0" 
    } else { 
     numberOfOrders.text = String((Int(numberOfOrders.text!)! - 1)) 
    } 
} 

func getOrders() -> Dictionary<String, Float> { 
    return addedList 
} 


func configureCell(post: OrderModel) { 
    self.post = post 
    self.dishName.text = post.dishName 
    self.dishDescriptionAndPrice.text = post.dishDescription 
    self.numberOfOrders.text = "0" 
} 

} 

私がやろうとしています何を、上記のクラスから「addedList」を取得し、(のUIViewControllerである)私の他のクラスを持っています。私は明らかにprepareForSegueを使うことができません。私はこの2つのクラスと互換性のある方法を見つけることができませんでした。私は新しいクラスを作成して2つの間の "橋渡し"を行い、データを転送することにしていますが、もう一度この方法を見つけることはできません。すべての助けが大変ありがとうございます、事前にありがとうございます。

具体的には、UIViewControllerは私のtableviewを保持し、上記のクラスは個々のセルのオブジェクトファイルです。 addButtonPressed IBactionが呼び出されたときにデータを転送する必要があります。

+0

あなたのUIViewControllerはあなたのテーブルビューを含むクラスですか? 2とのリンクは何ですか?いつあなたはセルから 'addedList'を取得しますか?セルが選択されたら? –

+0

ありがとうございます。私はこれらの質問に答えるために、質問を最後まで更新しました。 –

答えて

0

あなたのセルクラスにデリゲートを作成することによってこれを行うことができます。

cell.delegate = self 

をし、このようなあなたのセルクラスを更新:そして、あなたのビューコントローラクラスで、indexPathでの行のセルの下に、追加

protocol ClassNameDelegate:class { 
     func addButtonAction(addedList:[String:Float]) 
    } 

     @IBOutlet weak var dishName: UILabel! 
     @IBOutlet weak var dishDescriptionAndPrice: UILabel! 
     @IBOutlet weak var numberOfOrders: UILabel! 
     @IBOutlet weak var addOrderBtn: UIButton! 
     @IBOutlet weak var subtractOderBtn: UIButton! 


     //Create a delegate 

     weak var delegate: ClassNameDelegate? 

     @IBAction func addButtonPressed(sender: AnyObject) { 
      if numberOfOrders.text == "9" { 
       numberOfOrders.text = "9" 
      } else { 
       numberOfOrders.text = String((Int(numberOfOrders.text!)! + 1)) 
      } 
      addedList.updateValue(post.dishPrice, forKey: post.dishName) 
      print(addedList) 

      // Call this when added list is done and get the call to your view controller. 

      if delegate != nil { 
       delegate?.addButtonAction(addedList: addedList) 
      } 
     } 

     @IBAction func subtractButtonPressed(sender: AnyObject) { 
      if numberOfOrders.text == "0" { 
       numberOfOrders.text = "0" 
      } else { 
       numberOfOrders.text = String((Int(numberOfOrders.text!)! - 1)) 
      } 
     } 

     func getOrders() -> Dictionary<String, Float> { 
      return addedList 
     } 


     func configureCell(post: OrderModel) { 
      self.post = post 
      self.dishName.text = post.dishName 
      self.dishDescriptionAndPrice.text = post.dishDescription 
      self.numberOfOrders.text = "0" 
     } 

     } 

は最後に、あなたのビューコントローラクラスで、このデリゲートメソッドをインポートtableViewデリゲートとデータソースをインポートするのと同じ方法です。

+0

これは、私のUIViewControllerClassがプロトコル 'ClassNameDelegate'に従っていないというエラーです。 –

+0

このメソッドをインポートしましたか:func addButtonAction(addedList:[String:Float]) –

+0

あなたはプロトコルとそれに準拠していることに慣れておく必要があります。あなたが書いている言語にとっては基本的なものです。 – Wain

0

セルは、このような情報を格納するのには適していません。ビューコントローラに情報を格納する必要があります。セルのボタンを押すと、セルのインデックスパスの情報が取得されます。あなたのセルに

:あなたのビューコントローラで

func configureCell(post: OrderModel, delegate:UIViewController) { 
    self.dishName.text = post.dishName 
    self.dishDescriptionAndPrice.text = post.dishDescription 
    self.numberOfOrders.text = "0" 
    self.addButton.addTarget(delegate, action: #selector(delegate.addButtonPressed(_:)), for: UIControlEvents.touchUpInside) 
} 

//store your data in your view controller 
var data=[OrderModel]() 

func addButtonPressed(_ button:UIButton){ 
    let selectedCell=button.superview?.superview? as! OrderCell 
    let indexPath=tableView.indexPath(for: selectedCell) 
    let cellData=data[indexPath!.row] 

    if cellData.numberOfOrders==9{ 
     selectedCell.numberOfOrders.text="9" 
    }else{ 
     selectedCell.numberOfOrders.text=String(cellData.numberOfOrders+1) 
    } 
} 
+0

ありがとうございます。 'UIControlEvents'に 'touchUpInside'というメンバーがいないというエラーが表示されているようです。 –

+0

Swift 3で奇妙なことを書いていますか? –

+0

入力を開始するときに何を提案しますか? –

関連する問題