Chế độ xem tùy chỉnh với Bảng phân cảnh


96

Trong các màn hình phức tạp (View Controllers), tôi đã từng tách toàn bộ thành các phần nhỏ hơn (tôi gọi chúng là các widget). Các widget này về cơ bản bao gồm a MyWidget.hvà một MyWidget.mtệp cũng như một MyWidget.xibtệp, trong đó phần tử gốc là a UIViewvà lớp MyWidget là Chủ sở hữu tệp của UIView. Trong init của widget này, tôi làm một loadNibNamed.

Trong View Controller của tôi, sau đó, tôi thực hiện một [[MyWidget alloc] init], mà tôi thêm vào chế độ xem chính của View Controller làm chế độ xem phụ. Điều này, cho đến nay, hoạt động hoàn hảo.

Bây giờ tôi đang tự hỏi, làm thế nào để làm điều tương tự với bảng phân cảnh, bởi vì tôi thực sự không thể bắt đầu kéo vào một UIViewnơi nào đó, tôi luôn phải bắt đầu với một UIViewController, điều mà tôi không muốn.

Nếu không có cách nào khả thi để thực hiện việc này với Bảng phân cảnh, tôi có thể đơn giản làm theo cách cũ bằng cách sử dụng Bảng phân cảnh cho màn hình chính và các phần tiếp theo của tôi và sử dụng tệp .xib riêng biệt để xác định chế độ xem tùy chỉnh không?


Bạn có muốn tạo xibcác bộ điều khiển chế độ xem của mình một cách riêng biệt và không có trong bảng phân cảnh không?
tipycalFlow

bạn đã tìm thấy giải pháp chưa?
aryaxt

@aryaxt: Tôi đang sử dụng hỗn hợp Storyboard và xib's. Bảng phân cảnh cho màn hình chính và xib chỉ có UIView làm gốc cho các khung nhìn hoặc tiện ích phức tạp. Vì vậy, không thực sự là một câu trả lời cho câu hỏi ban đầu của tôi (bằng cách sử dụng bảng phân cảnh), nhưng về cơ bản là làm giống như những gì tôi đã làm trước đây.
znq

ngày nay, chỉ cần sử dụng chế độ xem vùng chứa , nó thực sự đơn giản như vậy .. stackoverflow.com/questions/23399061/…
Fattie,

Câu trả lời:


189

Đặt tiện ích / chế độ xem trong một tệp .xib riêng biệt sẽ hoạt động và đặc biệt thích hợp nếu bạn có thể muốn tham chiếu cùng một chế độ xem đó từ nhiều Bộ điều khiển Chế độ xem.

Tuy nhiên, đôi khi bạn muốn xem chế độ xem / tiện ích con bổ sung trong cùng một bảng phân cảnh và điều đó hoàn toàn có thể. Đây là cách bạn làm điều đó:

  1. Chọn bộ điều khiển chế độ xem của bạn trong IB (nhấp vào thanh màu đen bên dưới chế độ xem), sau đó kéo UIView từ Thư viện đối tượng vào thanh màu đen:

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

  2. Khi một chế độ xem ở trong thanh màu đen, nó được khởi tạo giống như bất kỳ chế độ xem nào khác trong IB nhưng chỉ không được thêm vào hệ thống phân cấp chế độ xem của bạn cho đến khi bạn làm như vậy trong mã. Thay đổi lớp của chế độ xem để khớp với lớp con của riêng bạn nếu cần:

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

  3. Bạn có thể kết nối nó với bộ điều khiển chế độ xem của mình giống như bạn kết nối với bất kỳ chế độ xem nào khác: nhập mô tả hình ảnh ở đây

  4. Chế độ xem đã thêm sẽ hiển thị trong Đề cương tài liệu của bạn và bạn cũng có thể kết nối các hành động và tham chiếu ở đó:

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


Bây giờ, vấn đề còn lại là bạn thực sự không thể nhìn thấy chế độ xem cho dù bạn cố nhấp hoặc nhấp đúp bao nhiêu lần, điều này sẽ đánh bại toàn bộ mục đích của việc đưa nó vào cùng một bảng phân cảnh. May mắn thay, có hai cách giải quyết mà tôi biết.

Cách giải quyết đầu tiên là kéo chế độ xem từ thanh màu đen trở lại chế độ xem của bộ điều khiển chế độ xem của bạn, chỉnh sửa nó, sau đó kéo chế độ xem trở lại thanh màu đen khi bạn đã hoàn tất. Điều này thật rắc rối nhưng đáng tin cậy.

Cách giải quyết khác phức tạp hơn, nhưng tôi thích nó hơn vì nó cho phép tôi xem tất cả các chế độ xem của mình cùng một lúc:

  1. Kéo UITableView từ Thư viện đối tượng vào dạng xem mới được thêm vào của bạn.

  2. Sau đó, kéo một UITableViewCell vào UITableView đó.

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

  3. Khi bạn làm điều đó, chế độ xem của bạn sẽ bật ra một cách kỳ diệu ở bên cạnh, nhưng bạn có một UITableView mà bạn không muốn. Bạn có thể thay đổi kích thước thành 0x0 hoặc bạn có thể xóa nó và UIView của bạn (thường) sẽ vẫn hiển thị.

  4. Đôi khi, chế độ xem phụ sẽ lại bị ẩn trong IB. Bạn có thể lặp lại các bước trên nếu đã xóa UITableView, hoặc nếu UITableView vẫn còn trong hệ thống phân cấp, bạn chỉ cần nhấp vào UITableViewCell và chế độ xem sẽ xuất hiện trở lại.

Phương pháp thứ hai hoạt động cho UIViews nhưng không tốt cho UIToolbars và không thể cho UIButtons, vì vậy giải pháp tốt nhất mà tôi đã tìm thấy khi bạn cần bao gồm nhiều lượt xem phụ khác nhau là đính kèm một UIView thứ cấp duy nhất vào bộ điều khiển chế độ xem của bạn như một vùng chứa không bao giờ được hiển thị, hãy đặt tất cả các chế độ xem phụ của bạn vào đó và sử dụng thủ thuật UITableViewCell để hiển thị mọi thứ. Tôi thay đổi kích thước UITableView giả của mình thành 0x0 để ẩn đi. Dưới đây là ảnh chụp màn hình về cách tất cả trông giống nhau:

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


Tháng 3 năm 2013, tôi không cần phải làm điều này - bạn nên bỏ qua thanh màu đen hoàn toàn và kéo / thả chế độ xem của bạn trực tiếp vào chế độ xem chính và nó hoạt động tốt (Xcode 4.5+)
Adam

Có thể sử dụng lại uivew tùy chỉnh đó trên cùng một ViewController không - Nếu tôi cũ. cần hai uivews tùy chỉnh - Và nếu nó là như thế nào?
Morten Gustafsson

2
Dang, tôi thích chỉ tạo một xib riêng biệt. Tôi có lẽ sẽ không nhớ tất cả những điều này khi tôi phải cập nhật ứng dụng sau 6 tháng nữa.
Sandy

Mặc dù đây là một câu trả lời tuyệt vời, tôi tình cờ tìm thấy một cách khác tốt hơn mà tôi nghĩ. Khi kết nối các cửa hàng với các thành phần xem thực tế. Nếu bạn di chuột qua một chút trên một thành phần của chế độ xem bên trong như vậy - nó sẽ bật lên để lựa chọn dễ dàng hơn. Sau đó, bạn nhìn thấy nó trên bảng phân cảnh ...
Oded Ben Dov

7
Mặc dù đây là một câu trả lời lịch sử vô cùng đáng ngưỡng mộ, nhưng thực sự thì giờ đây nó đã hoàn toàn lỗi thời. Apple đã khắc phục toàn bộ vấn đề bằng cách giới thiệu "chế độ xem vùng chứa", hiện là điều cơ bản, trọng tâm mà bạn làm khi tạo ứng dụng - mọi thứ đều là "chế độ xem vùng chứa". Cảm ơn trời, nó bây giờ rất dễ dàng!
Fattie,

11

Nếu bạn chỉ muốn đặt bộ điều khiển chế độ xem của mình ở nơi khác (chứ không phải trong bảng phân cảnh của bạn), thì có một cách khá đơn giản để thực hiện điều này:

1) Tạo các CustomViewControllers của bạn ( abcdControllertrong mã tôi đã thử) với các xibs cá nhân của họ như bình thường.

2) Thêm một UIViewController(hoặc bất cứ thứ gì là lớp cha của bạn CustomViewController) vào bảng phân cảnh.

3) Đặt CustomClass CustomViewControllerthay vì UIViewControllernhư được hiển thị ở đây:

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

4) Cuối cùng, trong của bạn viewDidLoad, tải tùy chỉnh xibvà bạn đã hoàn tất.

- (void)viewDidLoad
{
    [super viewDidLoad];
    [[NSBundle mainBundle] loadNibNamed:@"abcdController" owner:self options:nil];
    // Do any additional setup after loading the view from its nib.
}

3
Cảm ơn câu trả lời rất chi tiết của bạn, nhưng tôi thực sự không tìm kiếm một bộ điều khiển chế độ xem tùy chỉnh, mà là một chế độ xem tùy chỉnh (một tiện ích), được thêm vào một UIViewController tiêu chuẩn. Vì vậy, bộ điều khiển chế độ xem không phải là vấn đề, nhưng tôi đã tự hỏi cách tiếp cận tốt nhất là gì để tạo các vật dụng tùy chỉnh. Hoặc A) làm điều đó như tôi đã làm trước đây, với một tập tin .xib hoặc B) một số cách tiếp cận khác mà tôi không biết, nhưng :-)
znq

1
Hmm ... Tôi nghĩ tôi đã đạt được những gì bạn muốn. Về cơ bản, bạn muốn xử lý nhiều chế độ xem với cùng một bộ điều khiển, phải không? Tôi không thể nghĩ ra cách nào khác ngoài loadNibNamedtrường hợp đó ... XO
tipycalFlow

Điều này giải quyết vấn đề này cho tôi: stackoverflow.com/questions/11047991/... Tuy nhiên, thay vì viewDidLoad, tôi sử dụng loadView ...
Morkrom

1
Chỉ cần nhắc lại, đây là tất cả (cảm ơn trời đất!) Hoàn toàn lỗi thời khi các lượt xem vùng chứa ở đây. Chỉ cần nhấp một cái nhìn container và đó là tất cả được thực hiện
Fattie

1

Tôi nghĩ bạn có thể làm điều gì đó như thế này để lấy bản sao của bộ điều khiển chế độ xem cụ thể từ Bảng phân cảnh và sử dụng chế độ xem trên đầu nó.

ex:
MyViewController* myViewController = [[UIStoryboard storyboardWithName:@"Main"  bundle:nil] instantiateViewControllerWithIdentifier:@"myViewController"];
UIView* view = myViewController.view; //Get the view from your StoryBoard.

Hi vọng điêu nay co ich

Cảm ơn Vijay

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.