2015-11-03 3 views
9

için birden fazla parametre geçirin Benim UITableViewCell Benim bir düğmem var. Ve ben cellForRowAtIndexPath yönteminde birden çok parametre geçirerek eylem eklemek istiyorum.AddTarget

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier("CartCell", forIndexPath: 
     indexPath) as! CartTableViewCell 
    cell.buyButton.addTarget(self, action: self.buyButton(indexPath, 2, 3 ,4 , 5, 6), forControlEvents: .TouchUpInside) 
} 
+1

Hayır, bunu yapamaz. Eylem bir kapanış değil, bir seçicidir ve seçici, gönderici düğmesi olan 0 veya 1 argüman almalıdır. CellForRowAtIndexPath işlevindeki düğmeye bir eylem eklemek yerine, bir protokol tanımlamalı ve görünüm denetleyicinizi hücre temsilcisi olarak ayarlamanız gerekir. – Paulw11

+0

örnek gösterebilir misiniz, lütfen – Arti

cevap

31

you'r ihtiyacına göre etiket değeri oluşturun ve çok bütünlüğü var maintaint bu

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

    let cell = tableView.dequeueReusableCellWithIdentifier("CartCell", forIndexPath:indexPath) as! CartTableViewCell 
    cell.buyButton.tag = (indexPath.section*100)+indexPath.row 
    cell.buyButton.addTarget(self, action: "btnBuy_Click:", forControlEvents: .TouchUpInside) 
} 

func btnBuy_Click(sender: UIButton) { 
     //Perform actions here 
    let section = sender.tag/100 
    let row = sender.tag % 100 
    let indexPath = NSIndexPath(forRow: row, inSection: section) 
    self.buyButton(indexPath, 2, 3 ,4 , 5, 6) 
} 

gibi bir şey yapabilirsiniz olabilir.

+0

Bu çok saçma bir hack. İşe yarıyor ama süper hacky – Michael

+0

Süper fikir ve teşekkürler :), 100 bölüm ve 100 satır olduğunda tamamen yanlış, eğer 100. bölümde 100. satır seçtiyse, seçilen bölüm SIFIR olur ve satır 100 olur. –

+0

Swift3 son: http: // stackoverflow.com/questions/39617873 – Fattie

1

Sen ek parametreler

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
{ 
let cell = tableView.dequeueReusableCellWithIdentifier("CartCell", forIndexPath:indexPath) as! CartTableViewCell 
cell.buyButton.tag = (indexPath.section*100)+indexPath.row 
cell.buyButton.imageView.tag = 2 
cell.buyButton.titleLabel.tag = 3 
cell.buyButton.addTarget(self, action: "btnBuy_Click:", forControlEvents: .TouchUpInside) 
} 
2

Kolay eklemek için UIButtons en titleLabel ve UIImageView üzerinde tag özelliğini kullanabilirsiniz!

1: Alt Sınıf UIButton:

class IndexPathCellButton: UIButton { 
    var indexPath:NSIndexPath? 
} 

2: ayarlayın değeri:

... 
cell.indexPathButton.addTarget(self, action: #selector(LocationSearchViewController.cellOptionButtonClick(_:)), forControlEvents: .TouchUpInside) 
cell.indexPathButton.indexPath = indexPath // Your value 
... 

3: Al senin value:

@objc private func cellOptionButtonClick(sender: IndexPathCellButton) { 
    print(sender.indexPath) 
} 
5

Sanırım kodu güzelce mimar etmeliyiz. Hackler sadece kodunuzu anlamak ve buggy için zorlaştıracak. İşte bazı öneri.

class CustomButton:UIButton { 
var name:String = "" 
var object:MyObjectClassType? 

convenience init(name: String, object: MyObjectClassType) { 
    self.init(frame:CGRectZero) 
    self.name =name 
    self.object = object! 
}} 

Şimdi düğmeye hedefini eklemek özel bir düğme sınıfı olun

let btn = your custom button 
btn.name = “Your name” 
btn.object = any object 
btn.addTarget(self, action: #selector(myMethod(_:)), forControlEvents:.TouchUpInside) 

Şimdi basitçe yöntem çağrısında değerlerinizi almak geçmek gerekirse

@IBAction func myMethod(sender:CustomButton) { 
    print(sender.name) 
} 
+0

Temiz bir çözüm, bunu IB üzerinden gerçekleştirebileceğinizi mi düşünüyorsunuz? – OhadM

+0

@OhadM aynı akışta olacak .. film şeridindeki bağlı UIButton sınıfı türü CustomButton olarak değiştirilebilir .. init()/init? (Kodlayıcı aDecoder: NSCoder) ve awakeFromNib() yöntemleri CustomButton çağrılır Yüklemeden önce sınıf ama her zaman değişkenleri hazır olduğunda değişkenleri ayarlayabilirsiniz. Bu durumda tablo görünümünden önce delege çağrıları – sheetal

+0

gibi geliyor İyi bir fikir gibi geliyor ama yine de birkaç parçayı kaçırıyorsam, dediğin gibi özel bir düğme oluşturacaksak , gerçek dokunmadan önce ad ve nesne özelliklerini ayarlamamız gerekecek mi? Düğme bir hücrenin içindeyse ve VC içindeki eylemi almak için yanıtlayıcı zinciri kullanıyorum, fikrinizi kullanarak bunu nasıl başarabiliriz? Bu kullanım durumundaki özellikleri nasıl ayarlamalıyız? Cevabı düzenleyebilir ve bir kod snip veya örnek ekleyebilir misin? Teşekkürler :) – OhadM

8

dize sadece UIButton'un erişilebilirliğini kullanın.

Etiket yalnızca int saklayabilir, böylece dize verilerini iletmek isteyen herkes bunu kullanabilir. Ancak, bu verileri aktarmanın uygun bir yolu değil!

örnek:

button.accessibilityHint = "your string data" 
button.addTarget(self, action: Selector(("buttonTapped")), for: UIControlEvents.touchUpInside) 

func buttonTapped (sender: UIButton) { 
    let section = sender.accessibilityHint 
} 
+0

Yaratıcı hack, beni sırıttı. Teşekkürler – SQLiteNoob

+0

Hayır, erişilebilirlik ipucunu kullanmayın. Hangi kullanıcıların hangi görüntülerin VoiceOver olduğunu belirlemek için kör kullanıcılar tarafından kullanılır. ** ** erişilebilirlik tanımlayıcısını kullanabilirsiniz. Bu sadece uygulamanız tarafından kullanılıyor. (KIF gibi bazı test çerçeveleri test amaçlı alanları bulmak için erişilebilirlik tanımlayıcısını kullanabilir, ancak bu sıra dışı bir durumdur. –