2011-11-07 29 views
19

Tôi đã tranh luận với điều này một thời gian, hy vọng bạn có thể giúp tôi.Cách đặt đại biểu với bảng phân cảnh

Tôi đã tạo ứng dụng bằng cách sử dụng bảng phân cảnh, tôi có một điểm mà tôi bật lên một hộp phương thức để thêm bản ghi mới, cửa sổ bật lên hoạt động tốt, sự cố sẽ loại bỏ nó.

Tôi đã làm theo hướng dẫn của Apple về cách đóng đúng các hộp phương thức bằng cách sử dụng đại biểu và hoạt động tốt, ngoại trừ tôi cần thêm bộ điều hướng vào hộp phương thức của mình, vì quá trình thêm yêu cầu hai bước (ở đây fullscreen):

enter image description here

vấn đề nằm ở chỗ thiết lập các đại biểu, vì vậy đây là hai câu hỏi của tôi:

1- trong lớp xem gốc của tôi (My Tab) là một đại biểu của lớp Add (các phương thức) , mọi thứ được thiết lập ngay ngoại trừ điều này:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([[segue identifier] isEqualToString:@"showAdd"]) { 
     [[segue destinationViewController] setDelegate:self]; 

    } 
} 

Vấn đề nằm ở [segue destinationViewController] đang trả về điều hướng điều hướng chứ không phải lớp AddDrinkViewController (xem bảng phân cảnh). Làm thế nào để tôi có được điều này? Nếu tôi loại bỏ hoàn toàn bộ điều khiển điều hướng, mã hoạt động tốt thiết lập đại biểu thích hợp.

2- Có cách nào để đặt đại biểu bằng cách kéo các cửa hàng trong bảng phân cảnh không?

Cảm ơn!

+0

Tôi đã tìm kiếm ở khắp mọi nơi để biết cách đặt đại biểu của một phương thức. Cảm ơn rất nhiều vì mã đó. Haha – MattAitchison

Trả lời

13

Bạn nói đúng, destinationViewController sẽ là UINavigationController trong trường hợp này. Tôi đã viết một loại để xử lý tình trạng phổ biến này:

// category .h file 
@interface UIStoryboardSegue (NavControllerExtensions) 
// Gets destinationViewCotroller. But if that controller 
// is a NavigationController, returns the nav controller's 
// top level view controller instead. 
@property (readonly) id topLevelDestinationViewController; 
@end 

// category .m file 
@implementation UIStoryboardSegue (NavControllerExtensions) 
- (id)topLevelDestinationViewController 
{ 
    id dest = self.destinationViewController; 
    if ([dest isKindOfClass:[UINavigationController class]]) { 
    UINavigationController* nav = dest; 
    dest = nav.topViewController; 
    } 
    return dest; 
} 
@end 

Vì vậy, bây giờ bạn có thể chỉ cần làm điều này trong bất kỳ prepareForSegue phương pháp của bạn, và không cần phải lo lắng về việc liệu có còn tồn tại một NavigationController:

[[segue topLevelDestinationViewController] setDelegate:self] 
// another example: 
MyViewController *vc = segue.topLevelDestinationViewController; 
vc.delegate = self; // etc. 

Để trả lời câu hỏi thứ hai của bạn, tôi không thể tìm cách thiết lập đại biểu trong IB.

9

Tôi tìm thấy một cách ngắn hơn trong trường hợp của tôi (giống như bạn):

AddDrinkViewController *controller=[[[segue destinationViewController]viewControllers]objectAtIndex:0]; 
+1

Rất tuyệt! Giải quyết vấn đề của tôi như một sự quyến rũ! – iDroid

+0

Hoàn hảo, đã giải quyết được sự cố của tôi. Không thể hiểu tại sao tôi có thể tham khảo các thuộc tính của các viewControllers khác sử dụng cùng một bộ điều khiển nav nhưng không sử dụng các thuộc tính khác. Phew! –

+0

Rất đẹp. Điều này đã làm cho các trick cho tôi. Giải pháp thông minh. –

4

Về cơ bản bạn cần tạo một
Instance của UINavigationController và gán destinationViewController để nó
và lấy bộ điều khiển TopView nó

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([[segue identifier] isEqualToString:@"showAdd"]) { 

    UINavigationController *navigationController = segue.destinationViewController; 
    AddDrinkViewController *addDrinkcontroller = (AddDrinkViewController *)navigationController.topViewController; 

    addDrinkcontroller.delegate = self; 

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