Cập nhật 1/12/2016 : Đó là năm 2016 và tôi vẫn thích đặt UI của mình bằng mã chứ không phải trong Storyboards. Điều đó đang được nói, Storyboards đã đi một chặng đường dài. Tôi đã xóa tất cả các điểm khỏi bài đăng này mà đơn giản là không áp dụng nữa vào năm 2016.
Cập nhật 24/24/2015 : Điều thú vị là Apple thậm chí không sử dụng Storyboards trong ResearchKit có nguồn mở gần đây của họ như Peter Steinberger đã nhận thấy (dưới tiêu đề "Trình tạo giao diện").
Cập nhật 6/10/2014 : Theo dự kiến, Apple tiếp tục cải thiện Storyboards và Xcode. Một số điểm áp dụng cho iOS 7 trở xuống không áp dụng cho iOS 8 nữa (và hiện được đánh dấu như vậy). Vì vậy, trong khi Storyboards vốn vẫn còn thiếu sót, tôi sửa lại lời khuyên của mình từ không sử dụng sang sử dụng có chọn lọc ở nơi có ý nghĩa .
Ngay cả khi iOS 9 không hoạt động, tôi sẽ khuyên bạn chống lạithận trọng khi quyết định có nên sử dụng Storyboards không. Đây là lý do của tôi:
Bảng phân cảnh thất bại trong thời gian chạy, không phải lúc biên dịch : Bạn có một lỗi đánh máy trong một tên riêng biệt hoặc kết nối nó sai trong bảng phân cảnh của bạn? Nó sẽ nổ tung khi chạy. Bạn sử dụng một lớp con UIViewControll tùy chỉnh không còn tồn tại trong bảng phân cảnh của bạn? Nó sẽ nổ tung khi chạy. Nếu bạn làm những điều như vậy trong mã, bạn sẽ bắt chúng sớm, trong thời gian biên dịch. Cập nhật : Công cụ mới StoryboardLint của tôi chủ yếu giải quyết vấn đề này.
Bảng phân cảnh trở nên khó hiểu nhanh : Khi dự án của bạn phát triển, bảng phân cảnh của bạn ngày càng khó điều hướng hơn. Ngoài ra, nếu nhiều bộ điều khiển chế độ xem có nhiều phân biệt cho nhiều bộ điều khiển chế độ xem khác, bảng phân cảnh của bạn sẽ nhanh chóng trông giống như một bát mì spaghetti và bạn sẽ thấy mình phóng to và thu nhỏ và cuộn khắp nơi để tìm bộ điều khiển chế độ xem mà bạn đang tìm kiếm cho và để tìm ra những điểm segue ở đâu. Cập nhật : Vấn đề này chủ yếu có thể được giải quyết bằng cách chia Bảng phân cảnh của bạn thành nhiều Bảng phân cảnh, như được mô tả trong bài viết này của Pilky và bài viết này của Robert Brown .
Bảng phân cảnh làm việc trong một nhóm khó hơn : Bởi vì bạn thường chỉ có một tệp bảng phân cảnh lớn cho dự án của mình, việc nhiều nhà phát triển thường xuyên thay đổi một tệp đó có thể là vấn đề đau đầu: Các thay đổi cần được hợp nhất và giải quyết xung đột. Khi xảy ra xung đột, thật khó để nói cách giải quyết: Xcode tạo tệp XML bảng phân cảnh và nó không thực sự được thiết kế với mục tiêu là con người sẽ phải đọc, chứ đừng nói đến việc chỉnh sửa nó.
Bảng phân cảnh làm cho các đánh giá mã khó hoặc gần như không thể : Đánh giá mã ngang hàng là một điều tuyệt vời để làm cho nhóm của bạn. Tuy nhiên, khi bạn thực hiện thay đổi cho bảng phân cảnh, gần như không thể xem lại những thay đổi này với một nhà phát triển khác. Tất cả những gì bạn có thể kéo lên là một khác biệt của một tệp XML lớn. Giải mã những gì thực sự thay đổi và nếu những thay đổi đó là chính xác hoặc nếu chúng phá vỡ một cái gì đó thực sự khó khăn.
Bảng phân cảnh cản trở việc tái sử dụng mã : Trong các dự án iOS của tôi, tôi thường tạo một lớp chứa tất cả các màu và phông chữ và lề và các phần tử mà tôi sử dụng trong suốt ứng dụng để mang lại cho nó một giao diện nhất quán: Tôi phải thay đổi một dòng điều chỉnh bất kỳ giá trị nào cho toàn bộ ứng dụng. Nếu bạn đặt các giá trị như vậy trong bảng phân cảnh, bạn sẽ nhân đôi chúng và sẽ cần tìm mọi lần xuất hiện khi bạn muốn thay đổi chúng. Rất có thể là bạn bỏ lỡ một thứ, bởi vì không có tìm kiếm và thay thế trong bảng phân cảnh.
Bảng phân cảnh yêu cầu chuyển đổi ngữ cảnh liên tục : Tôi thấy mình làm việc và điều hướng mã nhanh hơn nhiều so với bảng phân cảnh. Khi ứng dụng của bạn sử dụng bảng phân cảnh, bạn liên tục chuyển ngữ cảnh: "Ồ, tôi muốn nhấn vào ô xem bảng này để tải trình điều khiển chế độ xem khác. Bây giờ tôi phải mở bảng phân cảnh, tìm trình điều khiển chế độ xem phù hợp, tạo một phân đoạn mới đến bộ điều khiển khung nhìn khác (mà tôi cũng phải tìm), đặt tên riêng cho tên đó, hãy nhớ tên đó (tôi không thể sử dụng hằng hoặc biến trong bảng phân cảnh), chuyển lại mã và hy vọng tôi không gõ nhầm tên của sự khác biệt đó đối với phương thức chuẩn bị của tôi. Tôi ước gì tôi có thể gõ 3 dòng mã này ngay tại nơi tôi đang ở! " Không, nó không vui. Chuyển đổi giữa mã và bảng phân cảnh (và giữa bàn phím và chuột) sẽ nhanh cũ và làm bạn chậm lại.
Bảng phân cảnh rất khó để cấu trúc lại : Khi bạn cấu trúc lại mã của mình, bạn phải chắc chắn rằng nó vẫn khớp với những gì bảng phân cảnh của bạn mong đợi. Khi bạn di chuyển mọi thứ xung quanh trong bảng phân cảnh của mình, bạn sẽ chỉ phát hiện ra trong thời gian chạy nếu nó vẫn hoạt động với mã của bạn. Tôi cảm thấy như thể tôi phải giữ hai thế giới đồng bộ. Nó cảm thấy dễ vỡ và không khuyến khích sự thay đổi trong quan điểm khiêm tốn của tôi.
Bảng phân cảnh kém linh hoạt : Về mã, về cơ bản bạn có thể làm bất cứ điều gì bạn muốn! Với bảng phân cảnh, bạn bị giới hạn trong một tập hợp con những gì bạn có thể làm trong mã. Đặc biệt là khi bạn muốn thực hiện một số điều tiên tiến với hình ảnh động và chuyển tiếp, bạn sẽ thấy mình "chiến đấu với bảng phân cảnh" để làm cho nó hoạt động.
Bảng phân cảnh không cho phép bạn thay đổi loại bộ điều khiển chế độ xem đặc biệt : Bạn muốn thay đổi UITableViewController
thành một UICollectionViewController
? Hay vào một đồng bằng UIViewController
? Không thể có trong Storyboard. Bạn phải xóa bộ điều khiển xem cũ và tạo một bộ điều khiển mới và kết nối lại tất cả các phân biệt. Việc thay đổi mã như vậy dễ dàng hơn nhiều.
Bảng phân cảnh bổ sung thêm hai khoản nợ cho dự án của bạn : (1) Công cụ Trình biên tập Storyboard tạo ra bảng phân cảnh XML và (2) thành phần thời gian chạy phân tích cú pháp XML và tạo các đối tượng UI và trình điều khiển từ nó. Cả hai phần có thể có lỗi mà bạn không thể sửa.
Bảng phân cảnh không cho phép bạn thêm một khung nhìn vàoUIImageView
: Ai biết tại sao.
Bảng phân cảnh không cho phép bạn bật Bố cục tự động cho từng Chế độ xem (-Contoder) riêng lẻ : Bằng cách kiểm tra / bỏ chọn tùy chọn Bố cục tự động trong Bảng phân cảnh, thay đổi được áp dụng cho TẤT CẢ các bộ điều khiển trong Bảng phân cảnh. (Cảm ơn Sava Mazăre về điểm này!)
Bảng phân cảnh có nguy cơ phá vỡ tính tương thích ngược cao hơn : Đôi khi Xcode thay đổi định dạng tệp Storyboard và không đảm bảo theo bất kỳ cách nào bạn có thể mở các tệp Storyboard mà bạn tạo ngày hôm nay vài năm hoặc thậm chí vài tháng kể từ bây giờ. (Cảm ơn những suy nghĩ cho điểm này. Xem nhận xét ban đầu )
Bảng phân cảnh có thể làm cho mã của bạn phức tạp hơn : init
Ví dụ : khi bạn tạo bộ điều khiển xem của mình bằng mã, bạn có thể tạo các phương thức tùy chỉnh initWithCustomer:
. Bằng cách đó, bạn có thể làm cho customer
bên trong bộ điều khiển khung nhìn của bạn không thay đổi và đảm bảo rằng bộ điều khiển khung nhìn này không thể được tạo mà không có customer
đối tượng. Điều này là không thể khi sử dụng Storyboards. Bạn sẽ phải đợi prepareForSegue:sender:
phương thức được gọi và sau đó bạn sẽ phải đặt thuộc customer
tính trên trình điều khiển chế độ xem của mình, điều đó có nghĩa là bạn phải làm cho thuộc tính này có thể thay đổi và bạn sẽ phải cho phép trình điều khiển xem được tạo mà không có customer
đối tượng . Theo kinh nghiệm của tôi, điều này có thể làm phức tạp mã của bạn rất nhiều và khiến cho việc suy luận về dòng chảy của ứng dụng trở nên khó khăn hơn. Cập nhật ngày 16/9/2016: Chris Dzombak đã viết một bài viết tuyệt vời về vấn đề này .
Đó là McDonald : Nói theo lời của Steve Jobs về Microsoft: Đó là McDonald (video) !
Đây là những lý do của tôi tại sao tôi thực sự không thích làm việc với bảng phân cảnh. Một số trong những lý do này cũng áp dụng cho XIB. Trong các dự án dựa trên bảng phân cảnh mà tôi đã làm việc, chúng đã tiêu tốn của tôi nhiều thời gian hơn so với chúng đã tiết kiệm và chúng khiến mọi thứ trở nên phức tạp hơn thay vì dễ dàng hơn.
Khi tôi tạo giao diện người dùng và ứng dụng trong mã, tôi sẽ kiểm soát nhiều hơn những gì đang diễn ra, dễ gỡ lỗi hơn, dễ dàng phát hiện ra lỗi sớm hơn, dễ dàng giải thích các thay đổi của tôi cho các nhà phát triển khác và nó dễ dàng hơn hỗ trợ iPhone và iPad dễ dàng hơn.
Tuy nhiên, tôi đồng ý rằng việc đưa ra tất cả UI của bạn trong mã có thể không phải là giải pháp một kích cỡ phù hợp cho tất cả các dự án. Nếu giao diện người dùng iPad của bạn khác rất nhiều so với giao diện người dùng iPhone của bạn ở một số nơi nhất định, có thể có ý nghĩa khi tạo XIB cho chỉ những khu vực đó.
Rất nhiều vấn đề được nêu ở trên có thể được Apple khắc phục và tôi hy vọng đó là những gì họ sẽ làm.
Chỉ hai xu của tôi.
Cập nhật : Trong Xcode 5, Apple đã loại bỏ tùy chọn tạo dự án mà không cần Storyboard. Tôi đã viết một tập lệnh nhỏ chuyển các mẫu của Xcode 4 (với tùy chọn từ chối Storyboard) sang Xcode 5: https://github.com/jfahrenkrug/Xcode4tem mẫu