2016-02-11 19 views
15

Tôi có hai VC: VC1 và VC2. Trong VC1, tôi có một số finish button mà tôi lập trình và result array Tôi muốn chuyển sang VC2.Làm cho Segue lập trình trong Swift

Tôi biết cách tạo Phân đoạn trong Bảng phân cảnh, nhưng tôi không thể làm điều đó vào lúc này vì finish button được tạo theo chương trình.

Nếu tôi muốn chuyển mảng kết quả bằng cách sử dụng segue, có cách nào để tạo segue theo chương trình không? Nếu điều này là không thể, tôi chỉ nên trình bày VC2 bằng cách sử dụng presentViewController và thiết lập một đại biểu để vượt qua result array?

+6

Bạn có thể tạo một phân đoạn trong trình tạo giao diện từ VC1 đến VC2, đặt tên cho nó, sau đó gọi 'performSegueWithIdentifier' từ hành động bạn đã gắn với nút. Sau đó, trong 'prepareForSegue' bạn muốn, đặt trong câu lệnh' if' IDing segue bạn đang dùng, lấy bất cứ thứ gì bạn đang truyền từ VC1, gán nó trên VC2 và BAM ... bạn đã hoàn thành. – Adrian

+0

Adrian, bạn nên đăng bài này như một câu trả lời để OP có thể chấp nhận nó. Đây là câu trả lời đúng cho câu hỏi OPs. –

Trả lời

26

Bạn có thể làm như được đề xuất trong câu trả lời này: InstantiateViewControllerWithIdentifier.

Ngoài ra, tôi đang cung cấp cho bạn mã từ câu trả lời được liên kết được viết lại trong Swift vì câu trả lời trong liên kết ban đầu được viết trong Mục tiêu-C.

let vc = UIStoryboard(name:"Main", bundle:nil).instantiateViewControllerWithIdentifier("identifier") as! SecondViewController 

vc.resultsArray = self.resultsArray 
self.navigationController?.pushViewController(vc, animated:true) 

EDIT:

Kể từ khi câu trả lời này thu hút được chăm sóc tôi nghĩ rằng tôi cung cấp cho bạn một cách khác để chạy failsafe hơn. Trong câu trả lời ở trên, ứng dụng sẽ gặp sự cố nếu số ViewController với số "số nhận dạng" không thuộc loại SecondViewController. Trong Swift bạn có thể ngăn chặn tai nạn này bằng cách sử dụng tùy chọn ràng buộc:

guard let vc = UIStoryboard(name:"Main", bundle:nil).instantiateViewControllerWithIdentifier("identifier") as? SecondViewController else { 
    print("Could not instantiate view controller with identifier of type SecondViewController") 
    return 
} 

vc.resultsArray = self.resultsArray 
self.navigationController?.pushViewController(vc, animated:true) 

Bằng cách này, ViewController được đẩy nếu nó là loại SecondViewController. Nếu không thể được đúc thành SecondViewController một tin nhắn được in và ứng dụng vẫn còn trên ViewController hiện tại.

+0

Vì OP đang hỏi về việc tạo phân đoạn từ một hành động nút, tạo ra một tên 'UIViewController' thành' UIViewController' segue và gọi nó với performSegueWithIdentifier, như được đề xuất bởi @AdrianB, có vẻ như là một giải pháp tốt hơn. –

+0

@ DuncanC đã đạt được điểm tốt nhưng giải pháp của Dehlen cũng đang hoạt động :) Tôi đã học được hai cách khác nhau mà tôi đoán. – Kahsn

+0

Xin chào, điều này đã hiệu quả đối với tôi, nhưng bây giờ khi tôi nhấp vào hủy để điều hướng trở lại, nó không hoạt động, bất kỳ ý tưởng nào có thể là sai? –

6

Bạn vẫn có thể tạo phân đoạn trong Trình tạo giao diện bằng cách kéo từ VC1 sang VC2 - chỉ cần kéo từ/đến vòng tròn nhỏ màu vàng ở đầu VC. Cho segue này một tên duy nhất trong IB, và trong hàm finish của bạn, bạn có thể gọi performSegueWithIdentifier:, chuyển vào tên của segue của bạn, và đó là nó. Trong phương thức prepareForSegue, bạn có thể tìm hiểu xem segue đang được thực hiện bằng cách truy cập segue.identifier và nếu đó là segue được đề cập, bạn có thể nhận con trỏ đến segue.destinationViewController và chuyển dữ liệu của bạn theo cách đó.

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