2014-10-05 36 views
43

Tôi đang làm ứng dụng iOS đơn giản với bộ điều khiển xem bảng và chi tiếtXem. Tất cả những gì tôi muốn là truyền dữ liệu qua segue.Truyền dữ liệu qua segue

this is how it looks like

đây là giao diện.

Tất cả những gì tôi muốn là u nhấp vào "Markíza", nó sẽ mở URL video số 1 và nếu bạn nhấp vào "TV JOJ", nó sẽ mở URL video số 2 trong trình phát.

tế bào tableview của tôi:

struct Program { 
     let category : String 
     let name : String 
    } 


    var programy = [Program]() 
     self.programy = [Program(category: "Slovenské", name: "Markíza"), 
         Program(category: "Slovenské", name: "TV JOJ")] 
+0

nhưng tôi nghĩ rằng đây là trong Objective-C và tôi cần nó trong nhanh chóng. – patrikbelis

+0

có thể trùng lặp của [Chuyển các biến từ một ViewController sang một biến khác trong Swift] (http://stackoverflow.com/questions/24044108/pass-variables-from-one-viewcontroller-to-another-in-swift) – Paulw11

Trả lời

107

Swift hoạt động chính xác theo cùng một cách như obj-C nhưng được làm lại bằng ngôn ngữ mới. Tôi không có nhiều thông tin từ bài viết của bạn nhưng hãy đặt tên cho mỗi TableViewController để giúp giải thích của tôi.

HomeTableViewController (đây là ảnh chụp màn hình bạn có ở trên)

PlayerTableViewController (đây là màn hình máy nghe nhạc bạn muốn đi du lịch đến)

Với những gì đã nói, trong PlayerTableViewController bạn cần phải có một biến sẽ lưu trữ dữ liệu được truyền. Chỉ dưới khai báo lớp bạn có một cái gì đó như thế này (nếu bạn có ý định để lưu trữ các cấu trúc như một đối tượng duy nhất chứ không phải là mảng:.

class PlayerTableViewController: UITableViewController { 

    var programVar : Program? 

    //the rest of the class methods.... 

Sau đó có hai cách bạn có thể gửi dữ liệu đến TableViewController mới

1) sử dụng prepareForSegue

Ở dưới cùng của HomeTableViewController bạn sẽ sử dụng các phương pháp prepareForSegue để vượt qua các dữ liệu. Dưới đây là một ví dụ về mã bạn sẽ sử dụng:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) { 

    // Create a variable that you want to send 
    var newProgramVar = Program(category: "Some", name: "Text") 

    // Create a new variable to store the instance of PlayerTableViewController 
    let destinationVC = segue.destinationViewController as PlayerTableViewController 
    destinationVC.programVar = newProgramVar 
    } 
} 

Khi PlayerTableViewController đã nạp các biến sẽ được đã được thiết lập và sử dụng

2) Sử dụng didSelectRowAtIndexPath

Nếu dữ liệu cụ thể cần được gửi dựa trên ô nào được chọn, bạn có thể sử dụng didSelectRowAtIndexPath. Để làm việc này, bạn cần phải đặt tên segue của bạn trong khung nhìn storyboard (cho tôi biết nếu bạn cần biết cách thực hiện điều này).

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 

    // Create a variable that you want to send based on the destination view controller 
    // You can get a reference to the data by using indexPath shown below 
    let selectedProgram = programy[indexPath.row] 

    // Create an instance of PlayerTableViewController and pass the variable 
    let destinationVC = PlayerTableViewController() 
    destinationVC.programVar = selectedProgram 

    // Let's assume that the segue name is called playerSegue 
    // This will perform the segue and pre-load the variable for you to use 
    destinationVC.performSegueWithIdentifier("playerSegue", sender: self) 
} 

Hãy cho tôi biết nếu bạn cần bất kỳ thông tin nào khác về vấn đề này

+0

sasha. kiểm tra câu trả lời của tôi. Tôi cần phải thích.Nếu sẽ được bấm vào CELL1 nó sẽ mở liên kết 1, Nếu sẽ được bấm vào CELL2 nó sẽ mở link2 – patrikbelis

+3

Tôi đã thử cách tiếp cận 2) và tôi luôn luôn nhận được một ngoại lệ nói rằng "Receiver PlayerTableViewController không có segue với identifier 'playerSegue'". Chỉ cần gọi 'performSegueWithIdentifier' hoạt động tốt, nhưng sau đó không có dữ liệu nào được chuyển sang chế độ xem mới. : [ – althaus

+0

@althaus Bạn đã đảm bảo có một tên phân biệt là "playerSegue" trong bảng phân cảnh của bạn chưa? Hình ảnh này cho thấy những gì bạn nên tìm kiếm. Nếu điều đó không thành công, hãy gửi cho tôi một số ảnh chụp màn hình và tôi sẽ kiểm tra nó. https://developer.apple.com/library/ios/recipes/xcode_help-IB_storyboard/art/SB_H_set_segue_identifier_2x.png –

10

Với Swift 3

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if (segue.identifier == "MainToTimer") { 
     let vc = segue.destination as! YourViewController 
     vc.var_name = "Your Data" 
    } 
} 
Các vấn đề liên quan