Bài 3.7 Segues và Navigation Controllers - Develop in Swift - Fundamentals
Bạn đã biết rằng view controller
quản lý các scene
khác nhau trong một ứng dụng. Nhưng khi ứng dụng của bạn trở nên phức tạp hơn, bạn sẽ thấy cần nhiều scene
khác nhau sử dụng các view controller
khác nhau để hiển thị thông tin. Bạn cũng sẽ cần chuyển đổi giữa các scene
khác nhau để cho phép người dùng điều hướng ứng dụng.
Trong bài học này, bạn sẽ học cách sử dụng segue
để chuyển đổi từ view controller
này sang view controller
khác, cách xác định mối quan hệ giữa các view controller
và cách navigation controller
có thể giúp bạn quản lý các scene
hiển thị nội dung liên quan hoặc phân cấp.
Nội dung bạn sẽ học:
- Cách di chuyển từ
view controller
này sangview controller
khác. - Cách thêm và tùy chỉnh
navigation controller
. - Cách truyền thông tin từ
view controller
này sangview controller
khác.
Từ vựng:
bar button
modal presentation
modal segue
navigation bar
navigation controller
pop
push
root view controller
segue
Show segue
unwind segue
Hãy xem các ứng dụng được sử dụng nhiều nhất trên điện thoại của bạn. Có ứng dụng nào chỉ có một màn hình luôn trông giống nhau không? Chắc là không. Hầu hết các ứng dụng đều có nhiều scene
để hiển thị các loại thông tin khác nhau. Mỗi scene
này được hỗ trợ bởi một instance
hoặc class
view controller
riêng biệt.
Công việc của bạn với tư cách là nhà phát triển là cho phép người dùng di chuyển dễ dàng từ scene
này sang scene
khác. Bạn có thể sử dụng Interface Builder để thêm segue
hoặc chuyển đổi giữa các scene
khác nhau. Bạn cũng có thể tạo mối quan hệ đặc biệt giữa các scene
có nội dung liên quan bằng cách đưa chúng vào navigation controller
.
Sau khi tìm hiểu về các loại segue
khác nhau, bạn sẽ học cách tạo segue
giữa các scene
khác nhau trong navigation controller
. Khi bạn đã thành thạo việc sử dụng segue
và navigation controller
, bạn sẽ có thể xây dựng các giao diện và cấu trúc điều hướng phức tạp hơn, từ đó trang bị cho bạn khả năng xây dựng các ứng dụng mạnh mẽ hơn.
Segues
Segue
xác định chuyển đổi từ view controller
này sang view controller
khác. Nó thường bắt đầu khi người dùng nhấn vào button
hoặc table row
và kết thúc khi một view controller
mới được hiển thị. Tương tự như việc tạo outlet
và action
, bạn xác định segue
trong Interface Builder bằng cách kết nối điểm bắt đầu và điểm kết thúc, nhấp và kéo từ scene
này sang scene
khác. Bạn cũng có thể kích hoạt segue
bằng code.
Ngoài chuyển đổi, segue
còn xác định phương thức hiển thị của view controller
. Một phương thức phổ biến là modal presentation
, đặt view controller
mới lên trên view controller
trước đó. Trên màn hình nhỏ hơn, modal presentation
sẽ luôn xuất hiện ở chế độ toàn màn hình. Để điều chỉnh giao diện cho các thiết bị lớn hơn, bạn có thể tùy chỉnh modal presentation
để xuất hiện dưới dạng popover
, form sheet
hoặc full-screen presentation
.
Khi tìm hiểu về navigation controller
ở phần sau của bài học này, bạn cũng sẽ học về push transition
, tạo hiệu ứng cho view controller
mới từ phải sang trái trên màn hình.
Khi một view controller
mới được hiển thị theo kiểu modal
, bạn có thể sử dụng unwind segue
để cho phép người dùng đóng view controller
mới và quay lại view controller
trước đó.
Tạo Segues được kích hoạt
Để thực hành chuyển đổi giữa các view controller
, bạn sẽ tạo một ứng dụng đơn giản thay đổi màu sắc của đèn giao thông. Bắt đầu bằng cách tạo một dự án Xcode mới bằng template
iOS App. Đặt tên cho dự án là “TrafficSegues.” Khi tạo dự án, hãy đảm bảo interface option
được đặt thành Storyboard. Chọn storyboard
Main
trong Project navigator
để mở dự án của bạn trong Interface Builder.
Thêm một UIButton
vào giữa view
, sử dụng alignment guide
để định vị. Nhấp vào button
Align
và chọn “Horizontally in Container” và “Vertically in Container” để tạo hai ràng buộc để căn giữa button
cho tất cả các kích thước màn hình.
Tìm View Controller
trong Object library
và kéo đối tượng này vào canvas
, định vị nó ở bên phải của view controller
đầu tiên. Sử dụng Attributes inspector
, hãy cho view controller
bên trái nền màu đỏ và view controller
bên phải nền màu vàng. (Ảnh chụp màn hình sử dụng tông màu sáng hơn để cung cấp thêm độ rõ nét.)
Hãy tưởng tượng bạn muốn chuyển sang view controller màu vàng khi người dùng nhấn vào UIButton của bạn trong view controller màu đỏ. Giữ phím Control, chọn button và kéo con trỏ đến view controller thứ hai. Hành động này sẽ làm nổi bật view controller màu vàng, cho biết đó là điểm kết thúc hợp lệ cho segue.
Khi bạn thả button
chuột hoặc trackpad
, bạn sẽ thấy một popover
cho phép bạn chỉ định phương thức hiển thị của segue
. Có nhiều segue
để lựa chọn, nhưng hãy tập trung sự chú ý của bạn vào “Present Modally” và “Show.” “Present Modally” sẽ hiển thị view controller
màu vàng trên màu đỏ, sử dụng hiệu ứng trượt từ dưới lên trên. Bạn sẽ thấy hiệu ứng này trong ứng dụng Mail khi bạn bắt đầu viết email mới hoặc trong Danh bạ khi bạn chọn tạo liên hệ mới.
Segue
Show
cũng hiển thị theo kiểu modal
cho đến khi navigation controller
được thêm vào scene
storyboard
. Bạn sẽ thêm một trong số này sau trong bài học. Bây giờ, hãy chọn Show
. Một mũi tên xuất hiện từ view controller
màu đỏ đến view controller
màu vàng cho biết segue
.
Xây dựng và chạy ứng dụng của bạn. Khi bạn nhấp vào UIButton
của mình, bạn sẽ thấy view
màu vàng được tạo hiệu ứng, từ dưới lên, trên cùng của view
màu đỏ.
Bây giờ, hãy thêm view controller
thứ ba, định vị nó ở bên phải của view
màu vàng. Đặt màu nền của nó thành màu xanh lá cây. Như trong các bước trước, hãy thêm UIButton
vào view
màu vàng, tạo ràng buộc căn giữa, sau đó Control-drag
từ button
đến view controller
màu xanh lá cây và xác định Show segue
.
Khi bạn xây dựng và chạy ứng dụng của mình, nhấn vào button
trên view controller
màu đỏ sẽ hiển thị theo kiểu modal
view controller
màu vàng và nhấn vào button
trên view controller
màu vàng sẽ hiển thị theo kiểu modal
view controller
màu xanh lá cây.
Lưu ý rằng view controller
màu đỏ thuộc loại ViewController
. Bạn không gán class
cho view controller
màu vàng và màu xanh lá cây, vì vậy chúng sẽ là instance
UIViewController
chung. Sự phân biệt này sẽ rất quan trọng khi bạn triển khai unwind segue
.
Unwind Segue
Bạn vừa tạo một chuỗi segue
ngắn. Mặc dù người dùng có thể vuốt xuống để đóng các view
này, nhưng cách tốt nhất là luôn bao gồm button
để đóng modal view
. Để thực hiện việc này, bạn cần tạo unwind segue
. Trong khi segue
chuyển sang scene
khác, unwind segue
chuyển đổi từ scene
hiện tại để quay lại scene
đã hiển thị trước đó.
Để bắt đầu, hãy chọn ViewController
trong Project navigator
và thêm phương thức sau ngay bên dưới hàm viewDidLoad()
:
@IBAction func unwindToRed(unwindSegue: UIStoryboardSegue) {
}
Bạn có thể đặt tên cho phương thức bất kỳ tên nào bạn muốn, nhưng nó phải nhận UIStoryboardSegue
làm tham số duy nhất.
Unwind segue
có thể khó hiểu lúc ban đầu. Bằng cách thêm một hàm nhận UIStoryboardSegue
làm tham số vào định nghĩa view controller
của bất kỳ scene
nào, bạn đang thông báo cho Interface Builder rằng scene
đó là đích đến hợp lệ cho unwind segue
.
Trong bài học này, phương thức bạn vừa thêm không chứa bất kỳ code nào, nhưng nó có thể được sử dụng để chuyển thông tin từ điểm kết thúc của segue
trở lại view controller
nguồn.
Hãy xem cách thức hoạt động. Quay lại storyboard
Main
, thêm một button
vào giữa view
màu xanh lá cây. Cập nhật văn bản của button
thành “Dismiss.”
Control-drag
button
Dismiss
đến đối tượng Exit
ở đầu scene
view controller
. Khi bạn thả button
chuột hoặc trackpad
, một popover
sẽ xuất hiện, liệt kê tất cả các đích đến khả dụng để unwind
. Trong trường hợp này, chỉ có một tùy chọn: unwindToRedWithUnwindSegue
, khớp với method signature
bạn đã đặt trong định nghĩa của ViewController
. Hãy tiếp tục và chọn nó.
Xây dựng và chạy ứng dụng của bạn. Khi bạn nhấp vào button
Dismiss
, nó sẽ unwind
toàn bộ trở lại view controller
màu đỏ.
Navigation Controllers
Modal segue
là phương pháp được ưu tiên để chuyển đổi từ ngữ cảnh này sang ngữ cảnh khác trong ứng dụng của bạn. Ví dụ: trong ứng dụng iOS Mail, nhấn vào button
Compose
chuyển từ chế độ đọc tin nhắn sang chế độ viết tin nhắn. Button
Cancel
luôn khả dụng nếu người dùng chọn quay lại ngữ cảnh trước đó.
Tuy nhiên, một số trường hợp yêu cầu segue
từ view controller
này sang view controller
liên quan. Ví dụ: khi người dùng nhấn vào một cell
trong Settings
, một view controller
mới được tạo hiệu ứng từ phải sang trái để bao phủ màn hình, trực quan thêm vào stack
của các view controller
được hiển thị. Việc thêm view controller
mới lên đầu stack
được gọi là pushing
vào stack
. Video sau minh họa hiệu ứng mặc định của push transition
so với modal transition
trong ứng dụng Settings
và Shortcuts
.
Nhấn vào button
Back
ở góc trên cùng bên trái hoặc vuốt trở lại sẽ đóng view
trên cùng và quay lại view controller
cao hơn tiếp theo, tạo hiệu ứng từ trái sang phải. Việc đóng view controller
từ đầu stack
được gọi là popping
khỏi stack
.
Navigation controller
quản lý stack
của các view controller
và cung cấp hiệu ứng khi điều hướng giữa các view
liên quan.
Một cách khác để hình dung về navigation controller
là nó phản ánh cấu trúc dữ liệu phân cấp. Trong trường hợp của Mail, danh sách tài khoản (gốc) cho phép bạn nhấn để hiển thị các thư mục của tài khoản. Nhấn vào mỗi thư mục sẽ hiển thị các tin nhắn của nó. Settings
cũng tương tự. Có một danh sách các danh mục cài đặt (gốc) mà một trong số đó có thể được chọn để hiển thị các cài đặt hoặc danh mục con bên trong, mỗi lần di chuyển sâu hơn vào cấu trúc phân cấp. Đối với ví dụ ở trên, từ gốc, General
được chọn và sau đó là Accessibility
trong đó. Pushing
một view controller
vào stack
sẽ đi sâu hơn vào cấu trúc phân cấp và popping
một view controller
khỏi stack
sẽ di chuyển ngược lên cấu trúc phân cấp đến gốc.
Quay lại dự án TrafficSegues của bạn, bạn có thể sử dụng navigation controller
để quản lý màn hình màu đỏ, vàng và xanh lá cây. Màu đỏ sẽ push
sang màu vàng và màu vàng sẽ push
sang màu xanh lá cây.
Để thêm navigation controller
vào scene
của bạn, hãy chọn view controller
màu đỏ. Tiếp theo, nhấp vào button
Embed In
trong thanh công cụ phía dưới và chọn Navigation Controller
. Ngoài ra, hãy chuyển đến thanh menu Xcode và chọn Editor > Embed In > Navigation Controller
.
Một trong hai phương pháp này sẽ đặt navigation controller
ở đầu scene
và đặt view controller
màu đỏ làm gốc của nó.
Xây dựng và chạy ứng dụng của bạn để xem những gì đã thay đổi. Bạn có thể nhận thấy một số điểm khác biệt quan trọng:
Show segue
giữa cácview controller
màu đỏ, vàng và xanh lá cây đã được điều chỉnh thànhShow (Push)
, thay vìPresent Modally
. (Đây là tính năng chính củaShow segue
: Nó điều chỉnh phương thức hiển thị tùy thuộc vào việc nó được sử dụng trongnavigation controller
hay độc lập.)Button
Dismiss
vẫnunwind
trở lạiview controller
màu đỏ, nhưng nó thực hiện bằng cáchpopping
cácview controller
thay vì đóng chúng.- Ở đầu mỗi
view
lànavigation bar
trong suốt, cung cấp không gian chobutton
Back
cũng như tiêu đề và cácbutton
bổ sung. Document Outline
hiện bao gồmNavigation Controller Scene
, bao gồmNavigation Bar
.
Navigation Bar
Một trong những tính năng dễ nhận thấy nhất của navigation controller
là navigation bar
, xuất hiện ở đầu màn hình. Navigation bar
có thể hiển thị tiêu đề và/hoặc các button item
.
Chọn navigation bar
trong Document Outline
và xem Attributes inspector
để xem thuộc tính nào bạn có thể tùy chỉnh, chẳng hạn như tint color
, title color
và title font
của thanh. (Bạn cũng có thể chọn sửa đổi các thuộc tính này trong code.) Xem tài liệu cho UINavigationBar
để biết danh sách đầy đủ các thuộc tính có thể tùy chỉnh.
Navigation Item
Mỗi UIViewController
đều có navigationItem
mà bạn có thể sử dụng để tùy chỉnh navigation bar
của nó. Khi bạn thêm navigation controller
trong bước trước đó, Interface Builder sẽ tự động thêm navigation item
vào view controller
gốc (màu đỏ).
Trong Document Outline
, hãy chọn navigation item
cho view controller
màu đỏ và mở Attributes inspector
. Nhập “Red” vào thuộc tính Title
.
Xây dựng và chạy ứng dụng. Khi bạn push
sang màn hình màu vàng, bạn sẽ nhận thấy rằng button
Back
hiện hiển thị “Red.” Điều đó xảy ra như thế nào? Button
Back
đã sử dụng tiêu đề của view controller
trước đó làm văn bản của nó. Tuy nhiên, nếu view controller
trước đó không có tiêu đề, button
Back
sẽ chỉ hiển thị “Back.” Nếu bạn muốn button
Back
sử dụng văn bản khác, chẳng hạn như “Go To Red,” bạn có thể nhập nó vào trường Back Button
trong Attributes inspector
của navigation item
view controller
màu đỏ.
Trong một số trường hợp nhất định, Interface Builder sẽ thêm navigation item
vào view controller
. Trong trường hợp nó chưa có, bạn có thể tự thêm một cái bằng cách tìm Navigation Item
trong Object library
và kéo nó lên trên view controller
của bạn.
Đặt tiêu đề của view controller
màu vàng và màu xanh lá cây bằng cách chọn Navigation Item
của chúng và sử dụng Attributes inspector
để tạo tiêu đề “Yellow” và “Green.”
Ngoài tiêu đề và button
Back
, navigation item
có thể bao gồm một loại button
đặc biệt, được gọi là bar button
, có thể xuất hiện trên navigation bar
hoặc toolbar
. Tìm Bar Button Item
trong Object library
và đặt một cái ở góc trên cùng bên phải của navigation bar
view controller
màu xanh lá cây.
Nhấp vào bar button
bạn vừa thêm và mở Attributes inspector
. Trong menu bật lên System Item
, bạn sẽ thấy các lựa chọn button
thường được sử dụng, chẳng hạn như Add
, Save
và Cancel
. Chọn một hoặc hai để xem văn bản button
thay đổi. Hãy thử với các thuộc tính Style
và Tint
. Các thuộc tính Bar Item
cho phép bạn tùy chỉnh button
của mình hơn nữa. Ví dụ: bạn có thể sử dụng trường Image
để thay thế tiêu đề văn bản bằng hình ảnh hoặc biểu tượng.
Bây giờ, hãy tiếp tục và cập nhật thuộc tính Title
của bar item
thành “Pop.” (Lưu ý rằng bản cập nhật này thay đổi tùy chọn System Item
thành Custom
.)
Tiếp theo, bạn có thể kết nối bar button
mới này với unwind segue
. Tham khảo các bước tương tự bạn đã sử dụng để kết nối button
Dismiss
. Sau khi hoàn tất, bạn có thể xóa button
Dismiss
.
Storyboard
của bạn hiện đã có tất cả các segue
của nó. Xây dựng và chạy ứng dụng của bạn để xem các tiêu đề và button
bạn vừa thêm. Lưu ý rằng nhấp vào button
Pop
sẽ đưa bạn trở lại view controller
màu đỏ.
Large Titles
Bạn có thể đã nhận thấy trong các ứng dụng hệ thống như Settings
rằng tiêu đề navigation bar
trên màn hình chính xuất hiện lớn hơn nhiều so với trong các scene
tiếp theo. Tiêu đề lớn này có thể được thêm vào ứng dụng của riêng bạn bằng cách chọn navigation bar
trong Interface Builder, sau đó chọn hộp “Prefers Large Titles” trong Attributes inspector
.
Lưu ý rằng tất cả các tiêu đề của bạn, không chỉ tiêu đề của view controller
đầu tiên, hiện đã áp dụng tiêu đề lớn. Bạn có thể điều chỉnh view controller
nào sử dụng tùy chọn tiêu đề lớn bằng cách chọn navigation item
được đề cập và chọn một trong các tùy chọn từ menu thả xuống Large Title
trong Attributes inspector
.
Tùy chọn Always
sẽ đảm bảo rằng tiêu đề của navigation item
đó sẽ luôn lớn; tùy chọn Never
sẽ đảm bảo rằng tiêu đề của navigation item
đó sẽ không bao giờ lớn; và tùy chọn Automatic
sẽ áp dụng hành vi của view controller
trước đó trong navigation stack
. Trừ khi bạn có lý do cụ thể để làm khác đi, cách thực hành tốt nhất là để view controller
gốc áp dụng tiêu đề lớn và các view controller
tiếp theo áp dụng tiêu đề nhỏ hơn.
Truyền thông tin
Trong nhiều ứng dụng, bạn sẽ cần chuyển thông tin từ view controller
này sang view controller
khác trước khi segue
diễn ra. Ví dụ: khi bạn nhấn vào một tên trong ứng dụng Danh bạ, chi tiết về liên hệ cần được chuyển tiếp đến màn hình Thông tin trước khi nó được hiển thị.
Để tìm hiểu cách thức hoạt động, bạn sẽ cập nhật view controller
màu đỏ để bao gồm text field
ngoài button
. Khi button
được nhấn, kích hoạt segue
, Interface Builder sẽ sử dụng bất kỳ văn bản nào trong text field
làm tiêu đề cho navigation item
của view controller
màu vàng.
Bắt đầu bằng cách kéo text field
từ Object library
vào view controller
màu đỏ, định vị nó ngay phía trên button
. Đối với ví dụ này, đừng lo lắng về việc thêm ràng buộc.
Tạo outlet
cho text field
, đặt tên là “textField.” Bạn sẽ cần tham chiếu đến text field
trong code để có thể truy cập văn bản và cập nhật tiêu đề của đích đến cho phù hợp.
Bây giờ bạn sẽ thiết lập segue
để chuyển văn bản từ text field
sang view controller
màu vàng.
Mỗi UIViewController
đều có một phương thức, prepare(for:sender:)
, được gọi trước khi segue
từ view controller
diễn ra. Bắt đầu nhập “prepare” gần cuối định nghĩa ViewController
, nhưng trước dấu ngoặc đóng. Xcode sẽ đề nghị giúp bạn hoàn thành tên phương thức. Chọn prepare(for segue: UIStoryboardSegue, sender: Any?)
và nhấn phím Return để thêm phương thức.
Tham số đầu tiên của phương thức này là chính segue
. Segue
chứa một số thuộc tính giúp chuyển thông tin qua nó:
identifier
— Tên củasegue
, phân biệt nó với cácsegue
khác. Bạn có thể đặt thuộc tính này trong Interface Builder bằng cách sử dụngAttributes inspector
.destination
—View controller
sẽ được hiển thị sau khisegue
hoàn tất. Trong khi giá trị làUIViewController
, bạn có thể cần ép kiểu nó thànhsubclass
UIViewController
cụ thể để truy cập các thuộc tính chỉ có thể truy cập trênsubclass
đó.
Vì chỉ có một segue
trên view controller
màu đỏ, nên không cần identifier
. Và vì mục tiêu của bạn là cập nhật thuộc tính title
của navigation item
và mọi UIViewController
đều có thuộc tính này, nên không cần ép kiểu. Vì vậy, code để đặt tiêu đề của navigation item
đích đến khá đơn giản:
override func prepare(for segue: UIStoryboardSegue,
sender: Any?) {
segue.destination.navigationItem.title = textField.text
}
Xây dựng và chạy ứng dụng của bạn. Sau đó, nhập một chuỗi ngắn vào text field
. Khi bạn nhấn button
, phương thức bạn vừa thêm sẽ cập nhật tiêu đề trên màn hình màu vàng.
Viết code để truyền dữ liệu giữa các scene
có thể hơi khó khăn lúc đầu. Nhưng bạn sẽ khám phá ra rằng việc truyền dữ liệu giữa các màn hình cực kỳ hữu ích và sẽ cho phép bạn viết code rất linh hoạt. Bạn sẽ tiếp tục làm việc với việc truyền thông tin bằng segue
trong dự án Personality Quiz.
Tạo Segues bằng code
Đôi khi bạn sẽ cần sử dụng một số logic để xác định có nên thực hiện segue
hay không. Mọi segue
mà bạn đã tạo tại thời điểm này đều liên quan đến việc kéo từ button
đến view controller
. Khi bạn tạo segue
theo cách này, nó sẽ luôn được thực hiện khi button
được nhấn. Trong phần này, bạn sẽ xác định một số segue
chung chung giữa các view controller
và quyết định bằng code xem chúng có nên được thực hiện hay không.
Trước khi bắt đầu, hãy khôi phục ứng dụng của bạn về trạng thái ban đầu. Xóa tất cả segue
, control
và label
hiện có khỏi storyboard
của bạn. Bạn cũng cần xóa mọi outlet
bạn đã tạo, cũng như các phương thức prepare(for:sender:)
và unwindToRed(segue:)
. Ứng dụng của bạn sẽ trông như thế này khi bạn đã sẵn sàng:
Trong ví dụ này, bạn sẽ đặt hai button
trên view controller
màu đỏ. Một button
sẽ segue
sang màn hình màu vàng và button
còn lại sẽ segue
sang màu xanh lá cây. Giao diện người dùng cũng sẽ bao gồm UISwitch
sẽ xác định xem có nên thực hiện segue
hay không. Nếu switch
được bật, segue
có thể được thực hiện; ngược lại, sẽ không có segue
nào diễn ra.
Bắt đầu bằng cách đặt hai button
và một switch
từ Object library
vào view
màu đỏ. Cập nhật tiêu đề của một button
thành “Push to Yellow” và button
còn lại thành “Push to Green.” Đặt switch
bên dưới các button
, như được hiển thị. Trong ví dụ này, đừng quá lo lắng về việc tạo ràng buộc để định vị view
cho mọi kích thước và hướng màn hình.
Thay vì Control-dragging
từ các button
đến các view controller
, bạn sẽ muốn Control-drag
từ view controller
màu đỏ đến view controller
màu vàng và màu xanh lá cây. Bằng cách đó, bạn đang xác định hai segue
chung chung: một segue
di chuyển từ màu đỏ sang màu vàng và một segue
khác di chuyển từ màu đỏ sang màu xanh lá cây. Control-drag
từ biểu tượng view controller
ở đầu màn hình màu đỏ đến view controller
màu vàng và tạo Show segue
, sau đó lặp lại bước này cho view controller
màu xanh lá cây.
Để thực hiện segue
trong code, bạn sẽ cần cung cấp cho mỗi segue
một chuỗi identifier
hợp lệ. Chọn chính segue
bằng cách nhấn vào dòng segue
. Trong Attributes inspector
, hãy đặt tên cho một identifier
là “Yellow” và identifier
còn lại là “Green.”
Bạn sẽ cần kiểm tra trạng thái của UISwitch
trong code để xác định có nên thực hiện segue
hay không. Để thực hiện việc này, bạn sẽ cần tạo outlet
cho switch
. Mở assistant editor
và Control-drag
từ switch
đến vị trí hợp lệ trong định nghĩa ViewController
.
@IBOutlet var segueSwitch: UISwitch!
Tạo action
cho mỗi button
bằng cách Control-dragging
từ button
đến vị trí hợp lệ trong định nghĩa ViewController
.
@IBAction func yellowButtonTapped(_ sender: Any) {
}
@IBAction func greenButtonTapped(_ sender: Any) {
}
Để thực hiện segue
bằng code, có một phương thức tồn tại trên các view controller
có tên là performSegue(withIdentifier:sender:)
. Tham số đầu tiên cho phương thức này nhận một String
, tương ứng với identifier
mà bạn đã gán cho segue
trong Attributes inspector
. Tham số sender
là thông tin bổ sung mà bạn có thể cung cấp cho segue
liên quan đến control
nào đã kích hoạt segue
, nhưng nó không cần thiết trong ví dụ này và có thể được đặt thành nil
.
Gọi performSegue(withIdentifier:, sender:)
trong mỗi phương thức chỉ khi switch
được đặt ở vị trí “On”.
@IBAction func yellowButtonTapped(_ sender: Any) {
if segueSwitch.isOn {
performSegue(withIdentifier: "Yellow", sender: nil)
}
}
@IBAction func greenButtonTapped(_ sender: Any) {
if segueSwitch.isOn {
performSegue(withIdentifier: "Green", sender: nil)
}
}
Xây dựng và chạy ứng dụng của bạn. Khi bạn nhấn vào mỗi button
, action
tương ứng sẽ được kích hoạt. Mỗi action
kiểm tra trạng thái của switch
và thực hiện segue
phù hợp nếu switch
được bật.
Nhớ lại rằng thuộc tính identifier
của UIStoryboardSegue
được truyền cho prepare(for:sender:)
cho bạn biết tên của segue
sắp được thực hiện. Kiểm tra tài liệu API cho shouldPerformSegue(withIdentifier:sender:)
. Làm cách nào bạn có thể di chuyển kiểm tra segueSwitch.isOn
sang shouldPerformSegue(withIdentifier:sender:)
thay vì bên trong action
của mỗi button
?