Phân cảnh bảng phân cảnh từ bộ điều khiển xem đến chính nó


76

Tôi đang cố gắng tạo cơ chế để xem chi tiết danh sách tệp / thư mục. Ý tưởng là hiển thị cùng một bộ điều khiển chế độ xem danh sách tệp mỗi khi người dùng chọn một thư mục và hiển thị bộ điều khiển chế độ xem chi tiết tệp nếu họ chọn một tệp.

Cho đến nay, tôi đã tạo một segue từ bộ điều khiển chế độ xem danh sách tệp đến bộ điều khiển chế độ xem chi tiết tệp và một bộ định danh từ ô xem bảng danh sách tệp đến bộ điều khiển xem bảng danh sách tệp:

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

Vấn đề với điều này là ngay sau khi người dùng nhấn vào ô, segue được thực thi. Tôi muốn xóa segue khỏi ô xem bảng và tạo một ô từ bộ điều khiển chế độ xem danh sách tệp cho chính nó. Bằng cách đó, tôi có thể kích hoạt xác định phù hợp theo lập trình khi người dùng chạm vào ô.

Vì vậy, câu hỏi của tôi là: Có thể tạo một segue từ bộ điều khiển chế độ xem cho chính nó trong Trình tạo giao diện không?


1
Có, bạn có thể sử dụng xcode 5. xem bài viết .
John Henckel

Mở menu Trình chỉnh sửa, nhấp Show Document Outline, sau đó chỉ cần kéo nút phải từ ô đến ViewControllerđối tượng Danh sách tệp của dàn bài .
DawnSong

Câu trả lời:


26

Tôi đã phát triển một phương pháp để tạo một segue bằng cách sử dụng một nút ảo. Tôi tin rằng nó sẽ giải quyết vấn đề của bạn. Bạn có thể đọc về nó trong câu trả lời của tôi ở đây .


4
Điều này đưa tôi đi đúng hướng. Tôi đã thêm một nút trên "Dock" và kết nối nó với bộ điều khiển chế độ xem danh sách tệp. Bây giờ tôi có thể thực hiện lập trình segue như tôi muốn. Cảm ơn!
Jorge

1
Tôi ước điều này không cần thiết chỉ để có được sự tự bảo vệ bản thân, nhưng điều này có hiệu quả.
Jogloran

2
Giải pháp của Mustafa ít hack hơn và khá đơn giản. Tạo các phần tiếp theo cho các góc nhìn giống nhau bằng các nút ảo sẽ chỉ làm cho bảng phân cảnh của bạn trở nên lộn xộn.
strada

43

Nếu bạn đang sử dụng bộ điều khiển điều hướng, bạn cần đẩy ViewController vào ngăn xếp điều hướng. Trong ví dụ này, tôi đã đặt tên ViewController của mình là "VDI" trong cài đặt ID bảng phân cảnh của mình.

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle: nil];
YourVC *dest = [storyboard instantiateViewControllerWithIdentifier:@"VDI"];
[self.navigationController pushViewController:dest animated:YES];

Nếu bạn không muốn NavigationController tiếp tục tự thêm vào lịch sử "Quay lại", bạn có thể bật ngăn xếp trước khi thêm vào nó như vậy.

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle: nil];
YourVC *dest = [storyboard instantiateViewControllerWithIdentifier:@"VDI"];
UINavigationController *navController = self.navigationController;
[navController popViewControllerAnimated:NO];
[navController pushViewController:dest animated:YES];

Cả hai phương thức này và @ TJ / @ Jorge sẽ hoạt động. Tôi đã đi theo cách này vì nó cảm thấy sạch sẽ hơn. Lợi ích mà tôi có thể nhìn thấy trong các phương pháp khác là bạn có thể thấy segues vòng lặp của bạn trong kịch bản, và rằng bạn có thể xử lý tất cả các điều hướng của bạn trong "prepareForSegue:"
siburb

1
Hoạt động hoàn hảo! Ngoài ra, đó là "ID bảng phân cảnh" trong XCode mà anh ấy đặt thành "VDI", dành cho những người muốn tạo lại điều này.
Nerrolken

31

Sử dụng Xcode 5 có một giải pháp đơn giản hơn nhiều .

  1. Nhấp vào ô bảng trong bảng phân cảnh
  2. Mở Trình kiểm tra kết nối (biểu tượng mũi tên phải ở phía trên bên phải)
  3. Trong "segues được kích hoạt", bạn thấy "lựa chọn"
  4. Kéo từ vòng tròn bên cạnh "lựa chọn" vào ô trong bảng phân cảnh

Đó là nó.


2
Cách tiếp cận này hoạt động giống như một sự quyến rũ không có dòng mã.
John Smith

2
Đây là những câu trả lời chính xác cho xcode 5+ và những ngày này bạn nên sử dụng một "show" segue cho việc này.
CupawnTae

2
Dường như không hiệu quả với tôi, bộ điều khiển chế độ xem không trở nên "xanh lam" để cho phép thêm segue.
db0

24

Thay vì thực hiện giả mạo cho cùng một bộ điều khiển, bạn có thể khởi tạo một bộ điều khiển chế độ xem (cùng một cái) từ bảng phân cảnh, rồi đẩy nó vào bộ điều khiển điều hướng.


Tôi thích giải pháp nút ảo hơn tất cả các quá trình chuyển tiếp của tôi đều phải thực hiện qua standardForSegue: thay vì ghi nhớ nếu chuyển tiếp được tạo bằng IB hoặc mã.
Steve Moser

19

Cách tiếp cận của Trình tạo giao diện: Chỉ cần xác định tham chiếu bảng phân cảnh tham chiếu trở lại trình điều khiển chế độ xem trình bày.


2
Cách tiếp cận này là đẹp nhất nếu điều hướng khác được thực hiện với segues trong IB! Cảm ơn!
Roland T.

Chắc chắn phải là câu trả lời được chấp nhận vì hiện đã có sẵn tham chiếu bảng phân cảnh (không phải là trường hợp khi op đặt câu hỏi)
Christophe Blin

Tôi thấy điều này là giải pháp nhất thanh lịch bây giờ mà nó có sẵn
ZShock

4
Chi tiết bổ sung: bạn cần cung cấp cho bộ điều khiển của mình ID Bảng phân cảnh và sau đó sử dụng ID đó trong trường ID được tham chiếu của tài liệu tham khảo.
John J. Camilleri

17

Câu trả lời chính xác là sử dụng một Tham chiếu bảng phân cảnh đang tham chiếu đến UIViewController mà bạn muốn phân biệt với chính nó và sau đó chỉ phân biệt vào nó.

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


12

Trong iOS 6, có một giải pháp gọn gàng hơn là sử dụng nút ảo. Bạn vẫn có thể xác định phân vùng từ ô bảng đến bộ điều khiển chế độ xem và nhìn vào người gửi để hủy phân vùng được kích hoạt tự động:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    //storyboards should use segues and override prepareForSegue instead
    //but here we need custom logic to determine which segue to use
    id item = [self.fetchedResultsController objectAtIndexPath:indexPath];
    if (item meets condition) {
        [self performSegueWithIdentifier:@"segue1" sender:self];
    } else {
        [self performSegueWithIdentifier:@"segue2" sender:self];
    }
}

- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender {
    //ignore segue from cell since we we are calling manually in didSelectRowAtIndexPath
    return (sender == self);
}

4

Đây là cách bạn có thể đẩy một phiên bản khác của bộ điều khiển chế độ xem hiện tại mà không cần xác định một segue hoặc mã hóa cứng mã nhận dạng riêng của nó:

SameViewController *same = [self.storyboard instantiateViewControllerWithIdentifier: self.restorationIdentifier];
[self.navigationController pushViewController: same animated: YES];

Bạn chỉ cần đặt ID khôi phục giống với ID bảng phân cảnh (có một hộp kiểm cho điều đó trong IB).

Khôi phục ID


0

Hi vọng điêu nay co ich.

Tôi thấy rằng bạn có thể tạo nhiều ô nguyên mẫu.

Ngoài ra, bạn có thể liên kết mọi ô (trong Bảng phân cảnh) với một Chế độ xem khác.

Một cái gì đó như thế này:

NSString *CellIdentifier = @"Cell"; 
if (Condition2 ){
CellIdentifier = @"Cell2"; } 
if (Condition3 ){
CellIdentifier = @"Cell3"; }
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.