Phân khúc để phân cảnh khác?


133

Có thể phân tách từ bảng phân cảnh này sang bảng phân cảnh khác hoặc nhúng bảng phân cảnh vào bộ điều khiển chế độ xem trong bảng phân cảnh khác không? Tôi cần đặt một UITabBarControllercái UINavigationController, và tôi muốn giữ chúng đẹp và tách biệt.


1
Nhìn vào câu trả lời này stackoverflow.com/a/19702425/317928
vokilam

5
Câu hỏi tuyệt vời. Có một bảng phân cảnh là một cơn ác mộng cho các dự án dựa trên nhóm. Chúng tôi thường xuyên chia các dự án thành các bảng phân cảnh theo "dòng chảy" (một bảng phân cảnh để đăng nhập, một bảng phân cảnh cho nguồn cấp tin tức và màn hình liên quan, v.v.). Nó giúp giảm thiểu số lượng xung đột hợp nhất, điều này sẽ xảy ra mỗi khi nhà phát triển chạm vào bảng phân cảnh.
Brian Sachetta

@BrianSachetta Bạn còn làm gì nữa? Bất kỳ lời khuyên tốt tương tự khác để chia sẻ?
Mật ong

Nó phụ thuộc vào cấu trúc nhóm của bạn. Nếu bạn thực sự muốn, bạn có thể có tất cả giao diện người dùng của mình trong các tệp .xib riêng biệt. Đây là cách nó được sử dụng trước khi bảng phân cảnh tồn tại. Có kìm và nhược điểm cho phương pháp này. Ưu điểm là hầu như bạn sẽ không bao giờ có xung đột với các nhà phát triển khác trong dự án. Nhược điểm là khó có thể nhìn thấy ứng dụng chảy trực quan.
Brian Sachetta

Câu trả lời:


201

Có, nhưng bạn phải làm điều đó theo chương trình:

// Get the storyboard named secondStoryBoard from the main bundle:
UIStoryboard *secondStoryBoard = [UIStoryboard storyboardWithName:@"secondStoryBoard" bundle:nil];

// Load the initial view controller from the storyboard.
// Set this by selecting 'Is Initial View Controller' on the appropriate view controller in the storyboard.
UIViewController *theInitialViewController = [secondStoryBoard instantiateInitialViewController];
//
// **OR**  
//
// Load the view controller with the identifier string myTabBar
// Change UIViewController to the appropriate class
UIViewController *theTabBar = (UIViewController *)[secondStoryBoard instantiateViewControllerWithIdentifier:@"myTabBar"];

// Then push the new view controller in the usual way:
[self.navigationController pushViewController:theTabBar animated:YES];

11
Tôi chỉ thực sự muốn giữ các bảng phân cảnh riêng biệt; họ đã quá bừa bộn.
Ry-

11
Giống như các chương trong một cuốn sách, tôi thấy sự cần thiết của nhiều bảng phân cảnh.
finneycanhelp

48
Khi bạn có nhiều nhà phát triển làm việc trên cùng một ứng dụng, việc có nhiều bảng phân cảnh trở nên rất hữu ích vì việc giải quyết xung đột kiểm soát phiên bản trong bảng phân cảnh xml đôi khi khá khó khăn.
Lee

14
Trong iOS 9 và Xcode 7, các tham chiếu bảng phân cảnh hiện được hỗ trợ. :-)
Quinn Taylor

1
Xem câu trả lời của milczi, bạn có thể thực hiện việc này ngay bây giờ rất dễ dàng trong giao diện người dùng!
Tim

117

Từ Xcode 7 trở đi, bạn có thể thực hiện việc này bằng đồ họa bằng cách sử dụng Tham chiếu bảng phân cảnh:

tài liệu tham khảo

Thêm tham chiếu Storyboard vào bảng phân cảnh của bạn. Tạo sự khác biệt giữa ViewContoder và Storyboard Reference (ctrl + drag)

Sau đó điền vào các lĩnh vực này.

nhập mô tả hình ảnh ở đây

Trong đó "Hướng dẫn" là tệp "Tutorial.storyboard" và "MainTutorialContoder" là trường "ID Storyboard" của bạn trong ViewContoderSinstall


1
Thông tin tốt, tuy nhiên câu hỏi được gắn thẻ ios5 vì vậy điều này không áp dụng.
lnafziger

10
@Inafziger có nhưng câu hỏi này xuất hiện ở đầu kết quả tìm kiếm cho những người sử dụng iOS 9
Brian Ogden

Điều này có sẵn từ XCode 7 trở đi. Xem thêm thông tin tại stackoverflow.com/questions/30772145/ Mạnh
Pickup Simon

Điều này đã làm việc, nhưng tôi cũng cần giữ thanh điều hướng, nó đang hiển thị mà không có thanh điều hướng, có cách nào để giữ một nút điều hướng và nút để di chuyển nó trở lại lịch sử, không quan trọng nó đến từ bảng phân cảnh nào?
Gil Beyruth

Điều này hoạt động với tôi trong iOS 10. Tôi đã lưu ý rằng tôi cần một tham chiếu bảng phân cảnh cho mỗi segue và không thể kết nối nhiều phân đoạn với một điểm tham chiếu.
Mark Reid

10

Bạn thực sự không thể thực hiện phân biệt thủ công vì UIStoryboardSegue là một lớp trừu tượng. Bạn cần phải phân lớp nó và thực hiện performđể nó làm bất cứ điều gì. Chúng thực sự có nghĩa là được tạo ra trong bảng phân cảnh. Bạn có thể đẩy bộ điều khiển xem bằng tay, tuy nhiên, đó là một giải pháp tốt. Câu trả lời của lnafziger làm tốt điều này:

UIStoryboard *secondStoryBoard = [UIStoryboard storyboardWithName:@"secondStoryBoard" bundle:nil];
UIViewController *theTabBar = [secondStoryBoard instantiateViewControllerWithIdentifier:@"myTabBar"];
[self.navigationController pushViewController:theTabBar animated:YES];

Tuy nhiên, một điều cần lưu ý là bạn đã nói rằng bạn muốn giữ mọi thứ tốt đẹp và riêng biệt. Ý tưởng của bảng phân cảnh là cho phép bạn giữ mọi thứ riêng biệt trong khi thực hiện tất cả các công việc thiết kế của bạn ở một nơi. Mỗi bộ điều khiển xem là tốt đẹp và tách biệt trong bảng phân cảnh từ những cái khác. Toàn bộ ý tưởng là giữ tất cả ở một nơi. Chỉ cần đặt nó ra một cách độc đáo để nó được tổ chức, và bạn sẽ tốt để đi. Bạn không nên tách nó trừ khi bạn có lý do thực sự tốt để làm như vậy.


6
hợp nhất các bảng phân cảnh không hoạt động tốt, vì vậy trong môi trường đa nhà phát triển, việc sử dụng các bảng phân tách riêng biệt có thể rất thú vị. Ngoài ra hiệu suất có thể trở nên khá tệ trong các dự án lớn với một bảng phân cảnh duy nhất.
calimarkus

1
Chúng tôi sử dụng nhiều bảng phân cảnh, nhưng vấn đề là bạn thực sự không thể làm điều đó và phân biệt giữa chúng. Apple đã thiết kế nó để bạn có thể làm mọi thứ ở một nơi, vì vậy ý ​​tưởng là loại chỉ sử dụng một (không phải là bạn không thể). Hiệu suất không phải là một vấn đề. Bảng phân cảnh được biên dịch thành các tệp nib riêng cho mỗi bộ điều khiển xem. Bạn sẽ có được hiệu suất rất tốt từ bảng phân cảnh. Hiệu suất sẽ tốt như thể bạn có xibs riêng cho mọi bộ điều khiển xem.
wbyoung

3
Trong trường hợp của tôi, vấn đề về hiệu năng thường nằm ở Xcode ... Việc triển khai trình chỉnh sửa bảng phân cảnh hiện tại của Apple là yếu.
Adam

1
Storyboard 60 cảnh mất 13 giây để mở trên Mac Pro 2014. Tôi đã nộp một radar.
Robert Atkins

7

Bạn không nên đặt UITabBarControllers trong UINavestionControll. Đó là yêu cầu các lỗi như autorotation / view unloading không chính xác, v.v., vì Apple không hỗ trợ loại ngăn chặn này:

Tuy nhiên, khi kết hợp các bộ điều khiển xem, thứ tự ngăn chặn là quan trọng; chỉ có sự sắp xếp nhất định là hợp lệ. Thứ tự ngăn chặn, từ trẻ em đến cha mẹ, như sau:

  • Bộ điều khiển xem nội dung và bộ điều khiển xem container có giới hạn linh hoạt (chẳng hạn như bộ điều khiển xem trang)
  • Bộ điều khiển xem điều hướng
  • Bộ điều khiển thanh tab
  • Bộ điều khiển xem chia

1
Tôi hoàn toàn đồng ý, và vì nhiều lý do. Đặt một TabBarContoder bên trong NavigationContoder không phải là một ý tưởng hay, bởi vì các đại biểu sẽ không kích hoạt chính xác các chế độ xem bên trong chúng và người dùng cuối sẽ có một thời gian khủng khiếp khi điều hướng giao diện. Họ sẽ gặp khó khăn khi quay trở lại bộ điều khiển dẫn ra khỏi giao diện TabBar / Navigation. Một cách khác, là OK, NavigationContoder bên trong TabBarControll. Tốt nhất là không nhầm lẫn người dùng cuối và lắng nghe đề xuất của Táo!
Hubert Kunnemeyer

1
Chưa hết, ứng dụng iPhone Music gốc thực hiện chính xác điều đó (phần "Đang phát").
Enzo Trần

FYI: Ứng dụng nghe nhạc trên iPhone không có TabbarControll trong màn hình "Đang phát".
sanjana

4

Đây là một phiên bản nhanh chóng:

let targetStoryboardName = "Main"
let targetStoryboard = UIStoryboard(name: targetStoryboardName, bundle: nil)
if let targetViewController = targetStoryboard.instantiateInitialViewController() {
    self.navigationController?.pushViewController(targetViewController, animated: true)
}

-1

bạn đã thử như sau:

2 / nhấp để chọn bộ điều khiển xem được liên kết với bộ điều khiển điều hướng của bạn và trong menu trên cùng: trình chỉnh sửa -> nhúng vào -> Trình điều khiển Tab Bar

Lưu ý: Tôi đã không kiểm tra vì tôi đang sử dụng ngược lại: tạo các ứng dụng thanh theo thẻ và đặt bộ điều khiển điều hướng bên trong).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.