2012-06-10 32 views
11

Tôi đã đọc tấn về nội dung này và trong khi hầu hết dường như liên quan đến cách tiếp cận không phải cốt truyện, tôi nghĩ mình đã ghép các bit lại với nhau và tìm ra. Tuy nhiên, mã sau đây không dẫn đến việc cửa sổ bật lên của tôi bị loại bỏ. Nút dismissPopoverButtonPressed trong Popover thực hiện nhưng một breakpoint trong phương thức dismissPopover trong delegate không bao giờ là hits. Sẽ rất nhiều đánh giá cao một người nào đó để mắt qua mã để phát hiện ra những sai lầm.Bảng phân cảnh: Loại bỏ Popover bằng cách sử dụng phương thức đại biểu/giao thức

Cảm ơn

Trong trường hợp sau, NewGameViewController chứa UIButton. Nhấn kết quả này trong Popover Segue và hiển thị tiếp theo của cửa sổ bật lên chứa PopViewController UIView.

NewGameViewController.h

#import "PopViewController.h" 
@interface NewGameViewController: UIViewController <DismissPopoverDelegate> 
{ 
    UIPopoverController *popover; 
} 

NewGameViewController.m

@implementation NewGameViewController 
-(void)prepareForSegue:(UIStoryboardPopoverSegue *)segue sender:(id)sender 
{ 
    if ([[segue identifier] isEqualToString:@"popoverSegue"]) 
    { 
     popover = [(UIStoryboardPopoverSegue *)segue popoverController]; 
     // getting warning: Assigning to 'id<UIPopoverControllerDelegate>' from incompatible type 'NewGameViewController *const__strong' 
     //popover.delegate = self; 
    } 
} 

-(void)dismissPopover 
{ 
    [popover dismissPopoverAnimated:YES]; 
} 

PopViewController.h

@protocol DismissPopoverDelegate <NSObject> 
-(void) dismissPopover; 
@end 

@interface PopViewController: UIViewController 
{ 
    __unsafe_unretained id<DismissPopoverDelegate> delegate; 
} 

@property (nonatomic, assign) id<DismissPopoverDelegate> delegate; 
-(IBAction)dismissPopoverButtonPressed:(id)sender; 
@end 

PopViewController.m

#import "NewGameViewController.h" 
@implementation PopViewController 
@synthesize delegate; 
-(IBAction)dismissPopoverButtonPressed:(id)sender 
{ 
    [self.delegate dismissPopover]; 
} 

Trả lời

13

Khi liên kết với một bộ điều khiển popover từ một segue kịch bản, các popoverController tài sản của segue đề cập đến một UIPopoverController chuẩn. Bộ điều khiển này có một thuộc tính, contentViewController, sẽ đại diện cho bộ điều khiển xem thực sự được trình bày trong cửa sổ bật lên, trong trường hợp của bạn là PopViewController.

Vì vậy, mã hiện tại của bạn sẽ tự đặt làm đại biểu của trình điều khiển cửa sổ bật lên, khi nó thực sự cần thiết lập chính nó làm đại biểu của bộ điều khiển chế độ xem nội dung của cửa sổ bật lên.

Bạn vẫn cần phải giữ một tham chiếu đến bộ điều khiển popover xung quanh, để sa thải, vì vậy giữ mã hiện tại của bạn, nhưng thực hiện thay đổi sau đây:

-(void)prepareForSegue:(UIStoryboardPopoverSegue *)segue sender:(id)sender 
{ 
    if ([[segue identifier] isEqualToString:@"popoverSegue"]) 
    { 
     popover = [(UIStoryboardPopoverSegue *)segue popoverController]; 
     // Get a reference to the content view controller of the popover 
     PopViewController *popVC = (PopViewController*)popover.contentViewController; 
     // Set ourselves as the content VC's delegate 
     popVC.delegate = self; 
    } 
} 
+0

Cảm ơn. Tôi phải thừa nhận, tôi thực hiện mã này không hoàn toàn hiểu được logic nhưng tôi nhớ lại đọc nhiều ý kiến ​​về việc phải khai báo rõ ràng một giao thức và ủy nhiệm để các sự kiện Popover có thể được xử lý trong VC tạo ra nó. Chắc chắn, các cách tiếp cận dường như khác nhau dựa trên việc Popover có được tạo rõ ràng trong mã hay không thông qua Storyboard. Với điều đó đã nói, tôi vẫn không khôn ngoan hơn ở trên. – Tony

+0

Tôi cũng đã thử đổi tên 'đại biểu' để ngăn chặn các xung đột như bạn đề xuất nhưng không có sự khác biệt. Khi bạn nói rằng cửa sổ popar của tôi nên được cụ thể hơn - bạn có ý nghĩa gì? – Tony

+0

Nếu SHARRP đang xem nội dung này, bạn có thể tạo một dự án ví dụ hay không (tương tự như dự án bạn đã làm cho http://stackoverflow.com/questions/5922254/how-to-dismiss-uipopover-from-a- button-in-the-popover) làm điều tương tự nhưng bằng cách sử dụng Storyboard (ví dụ, kiểm soát-kéo một segue để UIViewController mà xem sẽ xuất hiện bên trong Popover). Mã của tôi ở trên là một nỗ lực để thực hiện ví dụ của bạn nhưng có điều gì đó không đúng và việc sử dụng Storyboard/Segue có vẻ là sự khác biệt chính. – Tony

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