2011-12-18 45 views
6

Tôi có chế độ xem bảng với tiêu đề phần tùy chỉnh. Khung nhìn cho phần tiêu đề được định nghĩa trong bảng phân cảnh và được nối với một biến mẫu. Có cách nào để yêu cầu một phiên bản mới của chế độ xem từ bảng phân cảnh không?chế độ xem sử dụng lại từ bảng phân cảnh

Trong quá khứ tôi đã làm điều này bằng cách có tiêu đề phần định nghĩa trong file xib riêng của mình và nhận được một trường hợp mới bằng cách sử dụng

[[NSBundle mainBundle] loadNibNamed:@"TimerViewSectionHeader" owner:self options:nil]; 
UIView *newHeaderView = self.sectionHeaderView; 

Trả lời

3

tôi không' nghĩ rằng đó là một cách để làm điều đó. Đặt cược tốt nhất là đặt chế độ xem tiêu đề tùy chỉnh tableview trong một ngòi bút riêng biệt và tải nó giống như bạn đã làm trong mẫu mã của bạn bất cứ khi nào bạn cần sử dụng nó.

+0

+1 từ tôi. Tôi đã dành hàng giờ cố gắng tìm ra cách để xem tiêu đề bảng theo cách của Storyboard vì tôi đã tìm Storyboard là cách mới và được cải thiện trong việc đặt giao diện người dùng của ứng dụng của tôi. Thật không may bằng cách sử dụng Storyboard thất bại trong việc cung cấp trong bộ phận này và giải pháp tốt nhất là quay trở lại cách cũ để tải một nib cho chế độ xem hoặc xây dựng chế độ xem theo mã. Tôi thực sự muốn tin rằng tất cả giao diện người dùng của ứng dụng của tôi có thể được thực hiện trong một tệp Storyboard duy nhất nhưng điều này chắc chắn không phải là trường hợp. – ozz

0

Tôi đã có thể sử dụng lại chế độ xem trong bảng phân cảnh chỉ bằng cách kết nối chuyển đổi từ một lần xem bảng vào bảng tôi muốn sử dụng lại.

vì vậy bảng phân cảnh của tôi mà tôi muốn sử dụng lại được trỏ đến hai lần. Nó loại công việc nhưng vấn đề tôi đang chạy vào nó thiết lập một biến (sử dụng instantiateViewControllerWithIdentifier) ​​trong ứng dụng đại biểu của tôi để xem bảng của tôi đó là nhận được tái sử dụng. Dường như nếu tôi sử dụng lại nó, bảng phân cảnh sẽ tạo 2 trường hợp bảng nhìn của tôi và bảng tôi nhận được với instantiateViewControllerWithIdentifier không phải là thứ tôi muốn.

Tôi không thực sự chắc chắn nếu đây là cách thích hợp để làm điều đó. Nhưng tôi cho rằng nhiều người khác đang làm điều này bằng cách nào đó. Với các ô bảng tùy chỉnh trong bảng phân cảnh, tôi nghi ngờ rất nhiều người muốn sử dụng lại quan điểm của họ.

3

Tôi đã cố gắng làm điều tương tự và gặp phải vấn đề tương tự.

Tôi thích làm việc với bảng phân cảnh rất nhiều và đã rất ấn tượng về tốc độ tôi có thể tạo giao diện người dùng đang hoạt động. Tuy nhiên, ngay sau khi bạn cần sử dụng lại chế độ xem, điều này có ý nghĩa rất lớn khi đặt những người đó vào một ngòi bút riêng biệt cùng với lớp con UIViewController của nó.

Sau đó bạn có thể đặt một generic UIView ở tất cả những nơi tái sử dụng của bạn xem nên đi và thêm quan điểm sử dụng ViewController của bạn:

[myReusableViewController loadView]; 
[myReusableViewController viewDidLoad]; // You have to handle view callbacks yourself. 

[self.myReusableViewPlaceholder addSubview:myResusableViewController.view]; 
[myReusableViewController viewWillAppear:YES]; 

Vì vậy, để tóm tắt:

  • Sử dụng bảng phân cảnh, thật tuyệt vời
  • Tạo khung của ứng dụng trong bảng phân cảnh, cùng với bất kỳ chế độ xem tĩnh nào (như Giới thiệu về màn hình, v.v.)
  • Tạo các chế độ xem được sử dụng lại trong một lớp con nib + UIViewController tùy chỉnh và thêm UIView trình giữ chỗ trong bảng phân cảnh của bạn.

Trong câu trả lời khác tôi nghĩ về một số Pros and Cons of Storyboard

+0

là bạn chắc chắn bạn phải gọi lại cho chính mình - trông có vẻ hơi khó chịu với tôi – Rhubarb

+0

dù sao đi nữa với ý tưởng sử dụng UIView làm trình giữ chỗ. Lưu ý bạn có thể kết hợp điều này với câu trả lời của Krejko ở trên và thay vì tải bộ điều khiển từ ngòi bút, tải nó từ bảng phân cảnh (bạn có thể sử dụng một bảng phân cảnh để giữ một loạt các chế độ xem khác) – Rhubarb

+0

@Rhubarb Tôi không chắc chắn 100% rằng bạn phải tự mình gọi lại nhưng nếu bạn nhúng chế độ xem, thì bạn có trách nhiệm gọi nó, có vẻ như vậy. Xin lưu ý rằng trong iOS6.0 có một cơ chế mới để nhúng toàn bộ ViewController trong một vùng của bộ điều khiển xem hiện tại của bạn bằng cách sử dụng một Phân đoạn Nhúng. Đây cũng có thể là một lựa chọn. – Besi

3

Các giải pháp tôi đã đi lên với việc này là như sau:

Tôi có một tableview với nhiều tế bào nguyên mẫu hiển thị dữ liệu phức tạp. Có một sự khác biệt đối với một khung nhìn chi tiết và một khung nhìn quy trình giao dịch.

Chế độ xem bảng đầu tiên này có nút tìm kiếm hiển thị chế độ xem bảng mới với kết quả.Nó cần các chức năng tương tự như tableview chính đẩy nó; bao gồm cả phân đoạn đến chi tiết và tiến độ giao dịch, vì vậy:

Trên bảng phân cảnh, hãy chọn và sao chép chế độ xem bảng chính của bạn. Bỏ chọn và dán. Tạo một segue đẩy từ tableview chính của bạn để tableview thứ 2 của bạn; hoặc từ nơi bạn muốn điều hướng đến từ đó. Sửa đổi tableview thứ 2 như bạn muốn. IE: Nếu nó yêu cầu một số thay đổi giao diện người dùng không có vấn đề gì.

Tạo lớp chế độ xem mới là lớp con của chế độ xem đang chạy chế độ xem bảng chính.

Ghi đè đại biểu dữ liệu trong phân lớp của bạn để phân phối tập con dữ liệu bạn muốn.

Quay lại bảng phân cảnh, chọn bộ điều khiển xem bảng 2 của bạn và trong trình kiểm tra nhận dạng, hãy chọn lớp con của bạn làm lớp tùy chỉnh.

Để giải pháp này hoạt động trơn tru, ứng dụng của bạn thực sự cần quản lý dữ liệu cho các chế độ xem. Bạn có thể sử dụng preparforsegue để chuyển dữ liệu từ tableview đầu tiên đến lần thứ hai, nhưng tôi đã tìm thấy mô hình dữ liệu ứng dụng linh hoạt hơn nhiều từ nhiều quan điểm.

Trừ khi bạn có các nút đẩy đến chế độ xem phụ qua segue, lớp con của bạn sẽ cần phải ghi đè lên các hàm đẩy qua phân tách bằng danh tính. NB Segues phải có số nhận dạng duy nhất nếu bạn id chúng. Phải mất rất nhiều thử và sai để tìm ra điều này, nhưng một khi bạn hiểu được khái niệm, đó là một giải pháp tương đối trơn tru khá dễ thích nghi và không quá tệ để thực hiện.

3

Tôi không chắc chắn về chỉ xem, nhưng cách mà tôi đã có thể có được bộ điều khiển xem ra khỏi bảng phân cảnh của tôi là như sau.

UIViewController *viewController = [self.storyboard instantiateViewControllerWithIdentifier:@"IdentifierName"]; 

Từ đây, có lẽ bạn có thể sử dụng điều này tương tự như cách nó đã từng được thực hiện với ngòi.

+0

Điều này phải được đánh dấu là câu trả lời chính xác – Yariv

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