私は、ネットワークアップデートの結果をUITableViewCellのボタンにクロージャとして渡す方法を探しています。オンタブクロージャを実行した後、結果をUITableViewCellのボタンに渡しますか?
私は製品であり、いくつかのUITableViewCellsを持っています。これらのセルには、「カートに追加」ボタンがあります。私は、セットアップボタンのセル内のタッチハンドラを、私のUITableViewCell cellforRowAtIndexPath
方法でbuttonTap
閉鎖を設定し、そのハンドラが呼び出されたとき、buttonTap
閉鎖を実行します。私はメインコントローラ上に存在するカートオブジェクトを更新してカートを処理します。彼らは彼らのカートに多くの項目を追加することができるかどう
カートの更新アクションの結果はtrue
を返します。それに応じてボタンを更新します。私は代理人に対処する必要がないので、カートのロジック自体をセルから遠く離れた場所に置くことができるので、このアプローチが好きです。セルは、ボタンを有効/無効/読み込み/等にする方法を知っています。
/// Buttom tap callback callback.
public typealias Selection =() -> Bool
class MealTableViewCell: UITableViewCell {
var buttonTap: Selection?
// Runs when tapping the button
func didTapAdd() {
if let buttonBlock = buttonTap {
self.button.isLoading = true
// Simulate loading
DispatchQueue.main.asyncAfter(deadline: .now() + 0.4) {
self.button.enabled = buttonBlock()
self.button.isLoading = false
}
}
}
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = .... (fetch cell)
cell.buttonTap = {
// returns true if the user can add more items to their cart
return self.cart.update(product: product, quantity: 1)
}
}
私の質問は、現在、APIコールがないローカルです。私は現在、アイテムを追加したり削除したりするネットワークコールを使って、カートをAPI主導のものに切り替える予定です。つまり、今は非同期呼び出しであるので、私はもはや返すことができません私のcart.update(product:,quantity:)
メソッドから、まったく返す、または返すことができます。
だから、私は、メソッドのシグネチャが
self.cart.update(product: product, quantity: 1, success: { canAddMore in
// API call succeeded
}, failure: { error in
// fall failed
})
質問することをリライトのような何かを行うことができますがどのように私はtableViewCellにcanAddMore
を渡すことができるということですか?私はSelection
がPARAMとしてブール値を取るブロック内に取ることの意味を再定義する場合、それが唯一のブロックはセル自体上で実行されたときに渡されるように、私は、コントローラからのそれのparamを渡すことはできません。
がどのように私は本当に任意の値にすることができ
cell.buttonTap = {
cell.buttonTap = {
self.cart.update(product: product, quantity: 1), success: { canAddMore in
// !!!! What can I call here to pass canAddMore to the cell.
}, failure: { error in
}
}
}
canAddMore
ような何かを行うことができ、BOOLはちょうどこの一例です。私の大きな目標は、セルのロードとボタンの知識をコントローラー自体に結合することを避けることです。私がデリゲートを使用する場合、私は双方向のデリゲートでセルをコントローラの代理人にしなければならないでしょう。私は実際に閉鎖の結果をセルに戻すことが可能であることは肯定的ではないが、私はそこに存在することを望んでいる!
EDIT:それは、もともとその閉鎖による閉鎖と呼ばれる細胞(または任意のオブジェクト)に戻ってデータを渡すためにすべての可能性である場合、私は本当に答えるしようとしている大きな問題があります。テーブルビューでデータを変更するには、何百万もの方法がありますが、それは私が取り組もうとしている主なものです。
IもcanAddMore状態を格納する避けるために「見て」います(例えば、その製品の残量)に電力テーブルビューをメインの製品 '配列です。初期状態はそこに設定され、/ productsエンドポイントから返されますが、その後、在庫はカートのAPIアクションによって返されます。
などhow(各製品)に「canAddMore」状態がありますか?それともショッピングカート全体の「canAddMore」状態ですか? – DonMag
各製品について。製品の数量が残っている場合は、カートの 'updateItem'メソッドがロジックを処理します。 – chrismanderson
OK - 回答を追加する(回答はあまりにも多いが、コメントにはあまりにも多い)... – DonMag