2013-04-07 29 views
6

Tôi chỉ nhận ra rằng đoạn mã sau luôn tạo một Thẻ mớiFeedViewController mới. Đây có phải là hành vi mặc định của segues không? Có cách nào để cấu hình iOS để không tạo ra một newViewViewController mỗi lần?prepareForSegue ** luôn luôn ** tạo một newViewViewController mới?

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([segue.identifier isEqualToString:@"showSearchResult"]) { 
     TagsFeedViewController *destViewController = segue.destinationViewController; 
     destViewController.query = query; 
    } 
} 
+1

Có tất cả các phân đoạn ngoại trừ khoảng cách thư giãn tạo chế độ xemcontrollers - nhưng bạn đang sử dụng phân đoạn để làm gì nếu không tạo bộ điều khiển chế độ xem? –

Trả lời

1

Có, Đây là hành vi mặc định cho phân đoạn. Xem thông tin này post để biết thêm thông tin.

+0

liên kết không còn hợp lệ – CupawnTae

17

Phân đoạn sử dụng bất kỳ bộ điều khiển chế độ xem nào được cung cấp cho phương thức – initWithIdentifier:source:destination: của chúng. Nó không phải là segue tạo bộ điều khiển xem đích, mà là bảng phân cảnh. Từ the docs:

Thông thường, quan điểm điều khiển trong một kịch bản được khởi tạo và tạo ra tự động để đáp ứng với những hành động được xác định trong kịch bản riêng của mình.

Vì vậy, bạn có một số tùy chọn:

  • Subclass UIStoryboard. Có lẽ là một ý tưởng tồi. Giao diện công cộng cho UIStoryboard chỉ có ba phương thức; "hành động được xác định trong chính bảng phân cảnh" không công khai và tôi không nghĩ có đủ thông tin để cho phép bạn thực hiện công việc ngay.

  • Đặt bộ điều khiển chế độ xem đích của bạn thành một đĩa đơn. Cũng là một ý tưởng tồi. Ngoài các general badness that singletons bring with them, bạn không cần phải giữ một bộ điều khiển xem mà không có quan điểm và không có bộ điều khiển xem con xung quanh. Và làm cho lớp điều khiển xem của bạn một singleton chỉ để đánh lừa UIStoryboard vào bằng cách sử dụng một trường hợp cụ thể của lớp điều khiển xem của bạn có vẻ kinda icky.

  • Lớp con UIStoryboardSegue. Nếu bạn tạo phân đoạn riêng của mình, bạn có thể làm những gì bạn thích trong – initWithIdentifier:source:destination:, bao gồm bỏ qua trình điều khiển chế độ xem đích được cung cấp và sử dụng trình điều khiển bạn muốn thay thế. Điều này vẫn có vẻ như làm việc chống lại khuôn khổ, và đó thường là một kế hoạch kém, nhưng nếu bạn hoàn toàn phải sử dụng một trường hợp cụ thể của bộ điều khiển xem đích của bạn, điều này có vẻ như là một cách tốt hơn để đi.

  • Đi với luồng. Tùy chọn tốt nhất. Hãy suy nghĩ về lý do mà bạn đang hy vọng để phân biệt với một bộ điều khiển xem hiện có. Hãy xem xét liệu có thể có những cách tốt hơn để thực hiện những gì bạn muốn mà không phải phá hoại khung công tác. Ví dụ: bạn có muốn sử dụng trình điều khiển chế độ xem hiện tại vì nó đã có một số trạng thái cụ thể không? Có lẽ sẽ tốt hơn nếu duy trì trạng thái đó trong mô hình của bạn chứ không phải trong bộ điều khiển xem.

0

Bạn có thể ngăn việc tạo ra các bộ điều khiển bằng cách xử lý thông điệp shouldPerformSegueWithIdentifier:sender:.

-(BOOL) shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender 
{ 
    if ([identifier isEqualToString:@"showSearchResult"]) { 
     return [self.results count] > 0; 
    } 
    return YES; 
} 
+1

Dường như điều đó ngăn cản việc tạo bộ điều khiển bằng cách ngăn không cho segue được thực hiện. Tôi không nghĩ đó là những gì OP đang cố gắng hoàn thành. – Caleb

+0

@Caleb Tôi có thể đã hiểu sai câu hỏi nhưng tôi thấy không có lý do để thực hiện một segue mà không có một bộ điều khiển (trừ khi nó là một khóa học) – Tassos

+1

Tôi nghĩ rằng OP muốn sử dụng một segue để trình bày một bộ điều khiển xem hiện tại thay vì tạo ra một mỗi lần một. – Caleb

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