2014-09-28 17 views
18

Được rồi, vì vậy tôi có một cảnh TableView và tôi sẽ đặt một nút trong mỗi ô và tôi cần mỗi ô, khi được nhấp, segue đến cảnh ViewController riêng . Nói cách khác, tôi cần biết cách kết nối nút với cảnh (Nút duy nhất tôi có ngay bây giờ là "sữa")Swift: Làm cho nút kích hoạt segue sang cảnh mới

Tôi biết cách tạo một IBAction được liên kết với một nút, nhưng tôi sẽ đặt cái gì trong số IBAction?

Tôi là người mới bắt đầu nên tôi cần giải thích từng bước tại đây. Tôi đã bao gồm một hình ảnh của bảng phân cảnh của tôi. Tôi chưa viết bất kỳ mã nào. enter image description here

Trả lời

28

Nếu bạn muốn có nút kích hoạt quá trình chuyển đổi segue, điều dễ nhất cần làm là Control + Click từ nút đến bộ điều khiển xem và chọn tùy chọn Segue (như đẩy). Điều này sẽ nối nó trong IB cho bạn.

Nếu bạn muốn viết mã để tự làm điều này, bạn có thể làm như vậy bằng cách đặt tên cho segue (có một tùy chọn định danh mà bạn có thể đặt khi bạn tạo nó - bạn vẫn cần tạo segue trong IB trước khi bạn có thể làm điều đó) và sau đó bạn có thể kích hoạt nó với mã này:

V2

@IBAction func about(sender: AnyObject) { 
    performSegueWithIdentifier("about", sender: sender) 
} 

V3

@IBAction func about(_ sender: Any) { 
    performSegue(withIdentifier: "about", sender: sender) 
} 
+0

Được rồi tôi đã kiểm soát và bây giờ khi tôi nhấp vào nút ứng dụng gặp sự cố trên dòng đầu tiên của AppDelegate với "SIGABRT" – skyguy

+0

Không sao, tôi nhận được nó – skyguy

+0

Tôi nghĩ rằng nó phải là ** self.performSegueWithIdentifier ("about", người gửi : người gửi)** – Mehmet

13

Bạn có thể sử dụng delegation pattern. Giả sử rằng bạn đã triển khai một ô bảng tùy chỉnh, bạn có thể định nghĩa một thuộc tính trong lớp của nó để giữ bất kỳ thứ gì bạn nghĩ là hữu ích để xác định hàng - nó có thể là chỉ mục của nó, hoặc (cách ưa thích của tôi) một thể hiện của một lớp đại diện cho Dữ liệu được hiển thị trong ô (Tôi gọi nó là MyCellData.

Ý tưởng là để cho ô thông báo cho bộ điều khiển xem bảng về một lần nhấn vào nút đó, chuyển dữ liệu liên quan về (dữ liệu được hiển thị trong) hàng. Bảng điều khiển xem sau đó khởi chạy một segue, và trong phương thức prepareForSegue ghi đè nó lưu trữ dữ liệu được truyền qua ô tới bộ điều khiển đích. Nếu bạn phải hiển thị dữ liệu chi tiết về hàng, bạn có tất cả thông tin liên quan, chẳng hạn như bản thân dữ liệu chi tiết hoặc bộ nhận dạng mà trình điều khiển chế độ xem đích có thể sử dụng để truy xuất dữ liệu ví dụ từ cơ sở dữ liệu cục bộ hoặc dịch vụ từ xa.

Xác định một giao thức:

protocol MyCellDelegate { 
    func didTapMilk(data: MyCellData) 
} 

sau đó khai báo một tài sản có tên delegate trong lớp tế bào, và gọi phương thức didTapMilk của nó từ IBAction

class MyTableCell : UITableViewCell { 
    var delegate: MyCellDelegate? 
    var data: MyCellData! 

    @IBAction func didTapMilk() { 
     if let delegate = self.delegate { 
      delegate.didTapMilk(self.data) 
     } 
    } 
} 

Tiếp theo, thực hiện các giao thức theo quan điểm bảng của bạn bộ điều khiển, cùng với ghi đè prepareForSegue

extension MyTableViewController : MyCellDelegate { 
    func didTapMilk(data: MyCellData) { 
     performSegueWithIdentifier("mySegueId", sender: data) 
    } 

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) { 
     if segue.identifier == "mySegueId" { 
      let vc: MyDestinationViewController = segue.destinationViewController as MyDestinationViewController 
      vc.data = sender as? MyCellData 
     } 
    } 
} 

Tất nhiên bạn cần một tài sản data trên bộ điều khiển xem đích để làm việc. Như đã đề cập ở trên, nếu nó hiển thị chi tiết về hàng, bạn có thể nhúng tất cả dữ liệu cần thiết vào lớp MyCellData của bạn - hoặc ít nhất là những gì bạn cần để lấy dữ liệu từ bất kỳ nguồn nào (chẳng hạn như một DB cục bộ, dịch vụ từ xa, v.v.)

ngoái, trong cellForRowAtIndexPath, lưu trữ dữ liệu trong tế bào và thiết lập của nó delegate tài sản để self:

extension MyTableViewController : UITableViewDataSource { 
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let data: MyCellData = retrieveDataForCell(indexPath.row) // Retrieve the data to pass to the cell 
     let cell = self.tableView.dequeueReusableCellWithIdentifier("myCellIdentifier") as MyTableCell 
     cell.data = data 
     cell.delegate = self 

     // ... other initializations 

     return cell 
    } 
} 
0

Sử dụng self.performSegueWithIdentifier("yourViewSegue", sender: sender) dưới sự kiện của bạn để xử lý nút của nhấp chuột:

@IBAction func redButtonClicked(sender: AnyObject) { 
    self.performSegueWithIdentifier("redView", sender: sender) 
} 

Ở phía trên mã, redView là mã định danh segue.

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