2015-04-28 14 views
15

Tôi có một ứng dụng có nút tùy chỉnh trong ô tùy chỉnh. Nếu bạn chọn ô, nó sẽ phân biệt với một khung nhìn chi tiết, nó hoàn hảo. Nếu tôi chọn một nút trong một ô, mã dưới đây sẽ in chỉ mục ô trong bảng điều khiển.Làm cách nào để truy cập nội dung của ô tùy chỉnh nhanh chóng bằng cách sử dụng thẻ nút?

Tôi cần truy cập nội dung của ô đã chọn (Sử dụng nút) và thêm chúng vào mảng hoặc từ điển. Tôi mới đến điều này để đấu tranh để tìm hiểu làm thế nào để truy cập vào các nội dung của tế bào. Tôi đã thử sử dụng didselectrowatindexpath, nhưng tôi không biết cách buộc chỉ mục trở thành thẻ đó ...

Vì vậy, về cơ bản, nếu có 3 ô có 'Chó', 'Mèo', 'Chim' là cell.repeatLabel.text trong mỗi ô và tôi chọn các nút trong các hàng 1 và 3 (Chỉ mục 0 và 2), nó sẽ thêm 'Chó' và 'Chim' vào mảng/từ điển.

// MARK: - Table View 

override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
    return 1 
} 

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return postsCollection.count 
} 

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

    let cell: CustomCell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! CustomCell 

    // Configure the cell... 
    var currentRepeat = postsCollection[indexPath.row] 
    cell.repeatLabel?.text = currentRepeat.product 
    cell.repeatCount?.text = "Repeat: " + String(currentRepeat.currentrepeat) + " of " + String(currentRepeat.totalrepeat) 

    cell.accessoryType = UITableViewCellAccessoryType.DetailDisclosureButton 

    cell.checkButton.tag = indexPath.row; 

    cell.checkButton.addTarget(self, action: Selector("selectItem:"), forControlEvents: UIControlEvents.TouchUpInside) 


    return cell 

} 

func selectItem(sender:UIButton){ 

    println("Selected item in row \(sender.tag)") 

} 

Trả lời

55

OPTION 1. Xử lý nó với đoàn

Cách đúng xử lý sự kiện sa thải khỏi subviews của di động của bạn là sử dụng đoàn.

Vì vậy, bạn có thể làm theo các bước sau:

1. Trên nét lớp học của bạn viết một giao thức với một phương pháp trường hợp duy nhất bên trong tế bào tùy chỉnh của bạn:

protocol CustomCellDelegate { 
    func cellButtonTapped(cell: CustomCell) 
} 

2. Bên trong lớp học của bạn định nghĩa khai báo một biến đại biểu và gọi phương thức giao thức trên các đại biểu:

var delegate: CustomCellDelegate? 

@IBAction func buttonTapped(sender: AnyObject) { 
    delegate?.cellButtonTapped(self) 
} 
.210

3. Phù hợp với các CustomCellDelegate trong lớp mà xem bảng của bạn là:

class ViewController: CustomCellDelegate 

4. Đặt đại biểu của di động của bạn

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as CustomCell 
    cell.delegate = self 

    return cell 
} 

5. Thực hiện các phương pháp cần thiết trong lớp điều khiển xem của bạn.

EDIT: Đầu tiên xác định một mảng rỗng và sau đó sửa đổi nó như thế này:

private var selectedItems = [String]() 

func cellButtonTapped(cell: CustomCell) { 
    let indexPath = self.tableView.indexPathForRowAtPoint(cell.center)! 
    let selectedItem = items[indexPath.row] 

    if let selectedItemIndex = find(selectedItems, selectedItem) { 
     selectedItems.removeAtIndex(selectedItemIndex) 
    } else { 
     selectedItems.append(selectedItem) 
    } 
} 

nơi mục là một mảng được xác định trong điều khiển điểm của tôi:

private let items = ["Dog", "Cat", "Elephant", "Fox", "Ant", "Dolphin", "Donkey", "Horse", "Frog", "Cow", "Goose", "Turtle", "Sheep"] 

OPTION 2 . Xử lý nó bằng cách sử đóng cửa

tôi đã quyết định trở lại và chỉ cho bạn một cách khác để xử lý các loại tình huống. Việc đóng cửa trong trường hợp này sẽ dẫn đến ít mã hơn và bạn sẽ đạt được mục tiêu của mình.

1. Khai báo một biến đóng cửa bên trong lớp tế bào của bạn:

var tapped: ((CustomCell) -> Void)? 

2. Gọi đóng cửa bên trong handler nút của bạn.

@IBAction func buttonTapped(sender: AnyObject) { 
    tapped?(self) 
} 

3. Trong tableView(_:cellForRowAtIndexPath:) trong có chứa lớp view controller:

let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! CustomCell  
cell.tapped = { [unowned self] (selectedCell) -> Void in 
    let path = tableView.indexPathForRowAtPoint(selectedCell.center)! 
    let selectedItem = self.items[path.row] 

    println("the selected item is \(selectedItem)") 
} 
+0

Tôi thích giải pháp này tốt hơn một ở trên. Mặc dù, bạn quên đề cập đến rằng anh ta phải thực sự thiết lập các đại biểu. Khác hơn là giải pháp là rắn. –

+0

Tất nhiên tôi nên có, xấu của tôi. Sẽ chỉnh sửa nó. Cảm ơn. –

+0

Cảm ơn rất nhiều bạn. Nó hoạt động như một sự quyến rũ và đã cho tôi một cái nhìn sâu sắc về đại biểu .. vẫn còn rất nhiều người mới. –

9

Vì bạn có 1 phần trong chế độ xem bảng, bạn có thể lấy đối tượng ô như sau.

let indexPath = NSIndexPath(forRow: tag, inSection: 0) 
let cell = tableView.cellForRowAtIndexPath(indexPath) as! CustomCell! 

nơi thẻ bạn sẽ nhận được từ thẻ nút.

+0

nó sẽ không hoạt động mọi lúc ngay cả khi một phần của nó.suppose bạn đã xóa một ô từ tableview và nếu bạn truy cập thẻ như indexPath nó sẽ cung cấp cho bạn chỉ số sai.so hãy cẩn thận của ... –

1
@IBAction func buttonTap(sender: UIButton) { 
     let button = sender as UIButton 
     let indexPath = self.tableView.indexPathForRowAtPoint(sender.center)! 
} 
0

Dựa trên câu trả lời của Cao, đây là một giải pháp để xử lý các nút trong một tế bào xem bộ sưu tập.

@IBAction func actionButton(sender: UIButton) { 
     let point = collectionView.convertPoint(sender.center, fromView: sender.superview) 
     let indexPath = collectionView.indexPathForItemAtPoint(point) 
} 

Lưu ý rằng lệnh gọi hàm convertPoint() sẽ dịch tọa độ điểm nút trong không gian chế độ xem bộ sưu tập. Without, indexPath sẽ luôn luôn đề cập đến số lượng tế bào tương tự 0

4

Swift 3 tôi chỉ nhận được giải pháp cho di động truy cập vào chức năng @IBAction sử dụng SuperView của nút thẻ.

let cell = sender.superview?.superview as! ProductCell 
var intQty = Int(cell.txtQty.text!); 
intQty = intQty! + 1 
let strQty = String(describing: intQty!); 
cell.txtQty.text = strQty 
1

tôi cập nhật tùy chọn 1 trong những câu trả lời từ Vasil Garov cho Swift 3

1. Tạo một giao thức cho CustomCell của bạn:

protocol CustomCellDelegate { 
    func cellButtonTapped(cell: CustomCell) 
} 

2. Đối với bạn TableViewCell khai báo biến số delegate và gọi phương thức giao thức trên đó:

var delegate: CustomCellDelegate? 

@IBAction func buttonTapped(sender: AnyObject) { 
    delegate?.cellButtonTapped(self) 
} 

3. Phù hợp với các CustomCellDelegate trong lớp nơi tableView của bạn là:

class ViewController: CustomCellDelegate 

4. Đặt delegate

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as CustomCell 
    cell.delegate = self 

    return cell 
} 

5. của tế bào của bạn Thực hiện phương thức bắt buộc trong sốcủa bạn.

0

Xcode 8: Lưu ý quan trọng

Đừng quên để thiết lập các thẻ vào một giá trị khác nhau hơn 0.

Nếu bạn cố gắng truyền một đối tượng bằng thẻ = 0 thì nó có thể hoạt động nhưng trong một số trường hợp lạ thì không.

Khắc phục là đặt thẻ thành các giá trị khác nhau. Hy vọng nó sẽ giúp ai đó.

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