2015-09-02 12 views
5

Tôi có điều này bên trong cellForRowAtIndexPathGửi Row và Mặt cắt qua Tag trong Nút Swift

cell.plusBut.tag = indexPath.row 
    cell.plusBut.addTarget(self, action: "plusHit:", forControlEvents: UIControlEvents.TouchUpInside) 

và chức năng này bên ngoài:

func plusHit(sender: UIButton!){ 
    buildings[sender.tag].something = somethingElse 
} 

Có thể gửi indexPath.rowindexPath.section hoặc một số giải pháp thay thế ??

Cảm ơn!

EDIT

tôi tiếp cận nó như thế này:

My Tuỳ chỉnh nút

class MyButton: UIButton{ 

    var myRow: Int = 0 
    var mySection: Int = 0 

} 

My Tuỳ chỉnh di

class NewsCell: UITableViewCell{ 

    @IBOutlet weak var greenLike: MyButton! 

Trong cellForRowAtIndexPath

cell.greenLike.myRow = indexPath.row 

tôi nhận được một lỗi trên dòng này.

Trả lời

4

Bạn có thể tạo một lớp con của UIButton và tạo một phần thuộc tính bổ sung trong đó. Và sau đó bạn có thể sử dụng lớp đó cho nút di động. Bạn có thể làm tương tự cho hàng.

Dưới đây là vài cách tốt sau khi subclassing UIButton

cell.plusBut.tag = indexPath.row 
cell.plusBut.section = indexPath.section 

Hoặc

cell.plusBut.row = indexPath.row 
cell.plusBut.section = indexPath.section 

Hoặc

cell.plusBut.indexPath = indexPath 

Chọn bất cứ điều gì phù hợp với bạn.

+0

Tất nhiên, hãy yêu thích nó! –

+0

Xem lỗi của tôi ở trên ... Không chắc tại sao điều này lại xảy ra –

8

Có thể gửi indexPath.row và indexPath.section hoặc một số giải pháp thay thế không ??

Nếu bạn áp đặt giới hạn số hàng có thể trong một phần, bạn có thể kết hợp hai hàng thành một số. Ví dụ, nếu bạn sẵn sàng để nói rằng sẽ luôn có ít hơn 1000 hàng trong một phần nhất định, bạn có thể sử dụng:

cell.plusBut.tag = (indexPath.section * 1000) + indexPath.row 

và sau đó sử dụng các toán mod và bộ phận để phục hồi:

row = sender % 1000 
section = sender/1000 

Một khả năng khác là kiểm tra tính năng giám sát của nút (và đó là giám sát, vv ..) cho đến khi bạn tìm thấy ô đó. Khi bạn có ô, bạn có thể lấy đường dẫn chỉ mục cho ô đó từ bảng.

Tùy chọn thứ ba, có lẽ là tùy chọn tốt nhất, là để nút nhắm mục tiêu ô chứ không phải một số đối tượng khác. Sau đó, ô có thể kích hoạt một hành động trong trình điều khiển chế độ xem hoặc đối tượng khác sử dụng chính nó làm người gửi.

+0

Thật là một giải pháp tốt đẹp ... Tôi cũng đang cố gắng làm điều gì đó dọc theo những dòng này. Rõ ràng cả phần và hàng được giả định là Số nguyên –

+0

Tricky và chính xác. Đã bỏ phiếu! –

0

Tôi đề xuất một cách tiếp cận khác. Tôi không thích giải pháp phân lớp, tôi không nghĩ rằng nút nên biết vị trí của nó. Tại sao không sử dụng một từ điển để dịch các nút vào indexPath

// First initialize the lookup table 
var buttonPositions = [UIButton: NSIndexPath]() 

// add each button to the lookup table 
let b = UIButton() 
let path = NSIndexPath(forItem: 1, inSection: 1) 


buttonPositions[b] = path 

// Looking it up works like this 
buttonPostions[activeButton]?.row 
0

Bạn có thể gán một thẻ tùy chỉnh cho một UIButton qua mở rộng, hãy xem:

extension UIButton { 

private struct ButtonTag { 

    static var tagKey = "key" 

} 

var myTag : (Int , Int)? { 

    set { 
     if let value = newValue { 
      objc_setAssociatedObject(self, &ButtonTag.tagKey, value as! AnyObject, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC) 
     } 
    } 

    get { 
     return objc_getAssociatedObject(self, &ButtonTag.tagKey) as? (Int , Int) 
    } 
    } 
} 
2

Swift 2.x - Gia hạn với Associated Objects

private struct AssociatedKeys { 
static var section = "section" 
static var row = "row" 
} 

extension UIButton { 
var section : Int { 
    get { 
     guard let number = objc_getAssociatedObject(self, &AssociatedKeys.section) as? Int else { 
      return -1 
     } 
     return number 
    } 

    set(value) { 
     objc_setAssociatedObject(self,&AssociatedKeys.section,Int(value),objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC) 
    } 
} 
var row : Int { 
    get { 
     guard let number = objc_getAssociatedObject(self, &AssociatedKeys.row) as? Int else { 
      return -1 
     } 
     return number 
    } 

    set(value) { 
     objc_setAssociatedObject(self,&AssociatedKeys.row,Int(value),objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC) 
    } 
} 
} 

sử dụng:

//set 
cell.contextMenuBtn.section = indexPath.section 
cell.contextMenuBtn.row = indexPath.row 
//read 
func showContextMenu (sender:UIButton) { 
    let track = dictionarySongs[sender.section][sender.row] 
    ... 
} 
Các vấn đề liên quan