2012-06-22 27 views
10

Tôi đang xây dựng một bộ sưu tập các biểu mẫu, mỗi biểu mẫu chứa một số trường. Một số trường là UITextField s sẽ hiển thị ngày. Tôi đã tạo một lớp mới có tên là DatePickerTextField, một hậu duệ của UITextField. Khi số DatePickerTextField được nhấn, tôi muốn có một điều khiển UIDatePicker xuất hiện trong một số popover.Làm thế nào để sử dụng Storyboard để làm cho popover có thể được sử dụng trong mã?

Câu hỏi của tôi là làm cách nào để sử dụng bảng phân cảnh để triển khai popover? Tôi có thể làm một sự phân biệt khi có một điều khiển cụ thể, có thể nhìn thấy trong khung cảnh. Nhưng làm thế nào để tôi đại diện cho một chung popover trong cảnh mà tôi có thể đính kèm vào bất kỳ instantiated DatePickerTextField nào sẽ hoạt động?

Trả lời

36

Bạn có thể tạo khoảng cách không được kết nối với bất kỳ điều khiển nào nhưng tôi không nghĩ rằng sẽ có cách xác định điểm neo cho cửa sổ bật lên từ mã. Một tùy chọn khác là tạo ViewController không được kết nối với bất kỳ segue nào. Khi chỉnh sửa bảng phân cảnh, hãy tạo ViewController sẽ được đặt trong cửa sổ bật lên, chọn nó và điều hướng đến Ngăn tiện ích ->Thanh tra thuộc tính. Đặt Kích-Freeform, Status Bar-Không, xác định độc đáo Định danh sẽ được sử dụng để nhanh chóng ViewController từ mã. Giờ đây, bạn có thể thay đổi kích thước của ViewController bằng cách chọn Chế độ xem và điều hướng đến Ngăn tiện ích ->Trình kiểm tra kích thước.

Sau đó bạn có thể tạo popover từ mã:

- (IBAction)buttonPressed:(id)sender { 
    UIView *anchor = sender; 
    UIViewController *viewControllerForPopover = 
     [self.storyboard instantiateViewControllerWithIdentifier:@"yourIdentifier"]; 

    popover = [[UIPopoverController alloc] 
       initWithContentViewController:viewControllerForPopover]; 
    [popover presentPopoverFromRect:anchor.frame 
          inView:anchor.superview 
      permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; 
} 

Một caveat là bạn cần phải giữ tham chiếu đến popover như Ivar của lớp học của bạn, nếu không nó sẽ sụp đổ vì UIPopoverController sẽ được phát hành và deallocated sau buttonPressed trả về:

@interface MyViewController : UIViewController { 
// ... 
    UIPopoverController *popover; 
// ... 
} 
+2

Cảm ơn. Chính xác những gì tôi cần. Tôi sẽ thử ý tưởng đầu tiên của bạn để xem liệu người gửi cuộc gọi performSegueWithIdentifier có trở thành anchor hay không. Nếu điều đó không hiệu quả, tôi sẽ đi với ý tưởng thứ hai. –

2

Vì vậy, tôi có vấn đề tương tự và tôi chia sẻ nó vì tôi có lợi nhiều từ lưu lượng truy cập.

Giải pháp này cho phép bạn đặt neo của khoảng cách cửa sổ bật lên tùy chỉnh. Nó cũng cho phép bạn định cấu hình phân đoạn thành phương thức hay không (tôi không thể tìm cách ngăn chặn segue bằng cách làm mờ ngữ cảnh bên ngoài, vì vậy nếu ai đó biết cách làm điều đó, tôi sẽ thích nghe nó); điều này được thực hiện bằng cách thiết lập các khung nhìn passthrough cho bộ điều khiển popover. Tôi cũng đã thêm khả năng để chỉ định một khung nhìn tùy chỉnh, chứ không phải là khung nhìn của trình điều khiển xem nguồn (vì tôi cần khả năng này); phần này không quan trọng đối với giải pháp.

DynamicPopoverSegue.h

@interface DynamicPopoverSegue : UIStoryboardPopoverSegue 

@property BOOL isModal; 
@property UIView* sourceView; 
@property CGRect anchor; 

@end 

DynamicPopoverSegue.m

@implementation DynamicPopoverSegue 

- (void)perform 
{ 
    if (!self.popoverController.popoverVisible) 
    { 
     UIViewController* dst = (UIViewController*)self.destinationViewController; 
     UIViewController* src = (UIViewController*)self.sourceViewController; 

     UIView* inView = _sourceView ? _sourceView : src.view; 

     self.popoverController.contentViewController = dst; 
     if (!_isModal) 
     { 
     [self.popoverController setPassthroughViews:[[NSArray alloc] initWithObjects:inView, nil]]; 
     } 
     [self.popoverController presentPopoverFromRect:_anchor 
               inView:inView 
          permittedArrowDirections:UIPopoverArrowDirectionAny 
              animated:YES]; 
    } 
} 

@end 

Sau đó, bạn chỉ cần đặt segue của bạn để "Custom" trong kịch bản, và thiết lập các lớp segue để "DynamicPopoverSegue". Trong trường hợp của tôi, vì tôi muốn liên kết nó với các lớp động trong một khung nhìn, tôi không thể đặt neo, vì vậy tôi đã tạo phân đoạn bằng cách điều khiển bằng cách nhấp vào biểu tượng trình điều khiển chế độ xem trong thanh bên dưới trình điều khiển xem của tôi. sử dụng để trình bày popupover.

Để gọi segue popover:

[self performSegueWithIdentifier:@"MyPopoverSegue" sender:self]; 

Và để cấu hình segue popover:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([[segue identifier] isEqualToString:@"MyPopoverSegue"]) 
    { 
     DynamicPopoverSegue* popoverSegue = (DynamicPopoverSegue*)segue; 
     // set the anchor to wherever you want it to be 
     popoverSegue.anchor = _destinationFrame; 
    } 
} 
+0

Điều này không hiệu quả đối với tôi: khi cửa sổ bật lên được hiển thị, chạm vào bên ngoài nó không đóng nó giống như nó – xaphod

0
- (IBAction)pressItemChooseOprateRoom:(id)sender { 
    if (isPad){ 
     // UIView *anchor = sender; 
     UIViewController *viewControllerForPopover = 
     [self.storyboard instantiateViewControllerWithIdentifier:@"OperateRoomList"]; 

     _myPopover = [[UIPopoverController alloc] 
         initWithContentViewController:viewControllerForPopover]; 

     CGRect rc=[self getBarItemRc:sender]; 
     [_myPopover presentPopoverFromRect:rc 
            inView:self.view 
        permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; 

     [MLControl shared].popover =self; 
     // [self perfformSegueWithIdentifier:SEGUE_POP_OPERATEROOM sender:self]; 
    }else{ 
     [self iphoneOpenOperateRoomList]; 
     /* [self performSegueWithIdentifier:@"iPhonePushOperateRoom" sender:self]; 
     */ 
    } 
} 

-(void)iphoneOpenOperateRoomList{ 
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; 
    UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"OperateRoomList"]; 
    //  if (!index.showTabBar) { 
    //   vc.hidesBottomBarWhenPushed = YES; 
    //  } 

    [self.navigationController pushViewController:vc animated:YES]; 
} 
0

Chỉ cần sử dụng các câu trả lời từ Jonnywho cho dự án SWIFT của tôi. Trong trường hợp bạn cần nó:

Dưới đây là phiên bản SWIFT:

let anchor: UIView = sender 
    var viewControllerForPopover = self.storyboard?.instantiateViewControllerWithIdentifier("GameAboutViewController") as! UIViewController? 


    let popover = UIPopoverController(contentViewController: viewControllerForPopover!) 
    popover.presentPopoverFromRect(anchor.frame, inView: anchor, permittedArrowDirections: UIPopoverArrowDirection.Any, animated: true) 
Các vấn đề liên quan