2015-11-03 10 views
9

Trong số UITableViewCell Tôi có một nút. Và tôi muốn thêm hành động vào nó bằng cách chuyển nhiều tham số trong phương thức cellForRowAtIndexPath.Chuyển nhiều thông số để thêmTarget

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

Không, bạn không thể làm điều này. Hành động không phải là đóng, nó là một bộ chọn và bộ chọn phải lấy 0 hoặc 1 đối số, là nút người gửi. Thay vì thêm một hành động vào nút trong 'cellForRowAtIndexPath', bạn nên định nghĩa một giao thức và thiết lập bộ điều khiển xem của bạn như là các ủy nhiệm các ô. – Paulw11

+0

bạn có thể hiển thị ví dụ, xin vui lòng – Arti

Trả lời

31

Có thể là bạn có thể làm một cái gì đó như thế này

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) 
} 

Tạo giá trị thẻ theo yêu cầu của you'r và maintaint đó là toàn vẹn quá.

+0

Đây là một hack vô lý. Nó hoạt động nhưng nó là siêu hacky – Michael

+0

Ý tưởng tuyệt vời và cảm ơn :), Nhưng hoàn toàn sai khi tôi có 100 phần và 100 hàng sau đó, nếu tôi chọn hàng thứ 100 trên phần thứ 100 thì phần được chọn trở thành ZERO và hàng trở thành 100. –

+0

Swift3 mới nhất: http: // stackoverflow.com/questions/39617873 – Fattie

1

Bạn có thể sử dụng tag tài sản trên của UIButtons titleLabelUIImageView để thêm tham số bổ sung

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

dễ dàng!

1: Subclass UIButton:

class IndexPathCellButton: UIButton { 
    var indexPath:NSIndexPath? 
} 

2: Đặt giá trị của bạn:

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

3: Lấy của bạn giá trị:

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

Tôi nghĩ chúng ta nên kiến ​​trúc tốt mã. Các hacks sẽ chỉ làm cho mã của bạn khó hiểu và lỗi. Đây là một số gợi ý.

Tạo một lớp nút tùy chỉnh

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! 
}} 

Bây giờ thêm mục tiêu để nút của bạn

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

Bây giờ chỉ cần lấy giá trị của bạn trong cuộc gọi phương pháp

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

Đó là một giải pháp gọn gàng, bạn có thể đạt được điều đó thông qua IB không? – OhadM

+0

@OhadM nó sẽ có cùng lưu lượng .. ngoại trừ loại kết nối UIButton trong bảng phân cảnh có thể được thay đổi thành CustomButton .. Phương thức init()/init? (Coder aDecoder: NSCoder) và awakeFromNib() sẽ được gọi trên CustomButton lớp trước khi tải nhưng bạn luôn có thể đặt biến khi bạn có sẵn giá trị .. Giống như trong trường hợp này trước khi bảng xem các cuộc gọi đại biểu – sheetal

+0

Nghe như ý tưởng hay nhưng tôi vẫn thiếu vài phần, nếu chúng ta sẽ tạo nút tùy chỉnh như bạn đã nói , chúng ta sẽ phải đặt tên và thuộc tính đối tượng trước khi nhấn thực tế? Còn nếu nút bên trong một ô và tôi đang sử dụng chuỗi đáp ứng để nhận hành động bên trong VC, làm sao chúng ta có thể đạt được điều đó bằng ý tưởng của bạn? Chúng ta nên đặt các thuộc tính trong trường hợp sử dụng này như thế nào? Bất kỳ cơ hội nào bạn có thể chỉnh sửa câu trả lời và thêm một đoạn mã hoặc ví dụ? Cảm ơn :) – OhadM

8

Nếu bạn cần phải vượt qua chuỗi chỉ sử dụng AccessibilityHint của UIButton.

Thẻ chỉ có thể lưu trữ Int để nếu có ai muốn truyền dữ liệu chuỗi có thể sử dụng điều này. Tuy nhiên, đây không phải là cách thích hợp để truyền dữ liệu!

dụ:

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

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

Hack sáng tạo, khiến tôi cười nhếch mép. Cảm ơn – SQLiteNoob

+0

Không, không sử dụng gợi ý trợ năng. Nó được người dùng mù sử dụng để tìm ra chế độ xem nào là VoiceOver. Tuy nhiên, bạn ** có thể ** sử dụng mã định danh khả năng truy cập. Nó chỉ được ứng dụng của bạn sử dụng. (Một số khung kiểm tra như KIF có thể sử dụng mã định danh khả năng truy cập để tìm các trường cho mục đích thử nghiệm, nhưng đó là một trường hợp bất thường. –

Các vấn đề liên quan