2011-10-16 19 views
20

Điều này có thể không thực hiện được, nhưng tôi hy vọng một người nào đó sẽ có ý tưởng cách thực hiện.nút tạo cho neo xem cửa sổ bật lên tại thời gian chạy

Tôi có một ứng dụng tôi đang chuyển từ iPhone sang Universal. Trên iPhone, tôi đang sử dụng ứng dụng Tabbed. Tôi sử dụng ba tab cho dữ liệu bình thường được hiển thị. Tôi có một tab xuất hiện chỉ hiển thị nếu đáp ứng các điều kiện nhất định. Để thêm tab, tôi thực hiện:

if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) 
{ 
    UITabBarController *tabController = (UITabBarController *) self.rootViewController; 
    NSMutableArray* newArray = [NSMutableArray arrayWithArray: tabController.viewControllers]; 
    [newArray addObject: [theStoryboard instantiateViewControllerWithIdentifier: @"AdditionalView-Phone"]]; 
    [tabController setViewControllers:newArray animated:YES]; 
} 

Đối với iPad, tôi có đủ không gian trên màn hình ban đầu để hiển thị mọi thứ từ ba tab chính trong giao diện người dùng iPhone. Vì vậy, tất cả những gì tôi cần là một chế độ xem bổ sung (nhỏ) cho dữ liệu "Bổ sung". Tôi muốn làm điều đó bằng cách sử dụng một khung nhìn popOver, vì vậy tôi thiết lập giao diện ban đầu với một thanh Nav và nút popover như trong mẫu Utility App. Nhưng bây giờ tôi đang mắc kẹt. Tôi không thể tìm ra cách để tạo ra nút popover đó tại thời gian chạy và làm cho nó làm các segue để xem popOver đúng cách. Tôi có thể thêm các nút như thế này:

UIBarButtonItem *flipButton = [[UIBarButtonItem alloc] initWithTitle: @"Modem" style: UIBarButtonItemStylePlain target: self action: @selector(togglePopover:)]; 
self.navBar.topItem.rightBarButtonItem = flipButton; 

nhưng tôi nhận được một ngoại lệ: 'NSInternalInconsistencyException', lý do: 'UIStoryboardPopoverSegue phải được trình bày từ một mục nút thanh hoặc một cái nhìn' Tôi khá chắc chắn điều này là bởi vì tôi không có một bộ neo cho phân đoạn popOver. Nút không tồn tại trong bảng phân cảnh, vì vậy tôi không thể đặt nó ở đó. Và tôi dường như không thể tìm thấy một API để đặt nó vào thời gian chạy.

Tôi cũng đã thử tạo nút trong IB, nhưng không phải trong phân cấp khung nhìn, và sau đó chỉ cần đặt thuộc tính rightBarButtonItem vào nút hiện có của tôi. Điều đó cũng hoạt động, nhưng tôi vẫn không thể đặt nút đó làm neo cho chế độ xem cửa sổ bật lên. Tôi có thể đặt thanh điều hướng làm neo, nhưng điều đó làm cho nó neo vào tiêu đề trong thanh điều hướng, trông ngớ ngẩn.

Bất kỳ ý tưởng nào?

+0

Hey @Flyingdiver bạn đã tìm được giải pháp cho điều này chưa? – Rog

+0

Đúng, hãy tạo một UIView ẩn để hiển thị cửa sổ bật lên và di chuyển đến nơi bạn cần. –

Trả lời

13

Tôi đã có cùng một vấn đề và giải quyết nó bằng cách tạo ra một UIBarButtonItem trong Storyboard cho bộ điều khiển xem nhưng không phải là một phần của hệ thống phân cấp khung nhìn.

Trong IB, kéo mục nút thanh vào thanh màu tối bên dưới giao diện bộ điều khiển chế độ xem, thả nó bên cạnh biểu tượng "Phản hồi đầu tiên" và "Xem bộ điều khiển". Tạo một IBOutlet (mạnh) cho nó. Sau đó, tạo một phân đoạn bật lên từ nó đến bộ điều khiển xem đích bằng cách kéo từ mục nút thanh đến đích. Có vẻ như đây là cách duy nhất để đặt nó là neo. Chọn nó như là neo cho một segue hiện tại không hoạt động (trông giống như một lỗi IB).

enter image description here

Trong viewDidLoad bạn có thể gán thanh này nút mục vào navigationItem (hoặc nơi nào bạn thích) và segue hoạt động như mong đợi.

3

Tôi đã tò mò về điều này vì vậy tôi đã thực hiện một dự án thử nghiệm nhanh chóng. Bạn nói đúng, dường như không có cách nào để định cấu hình phân đoạn cửa sổ bật lên khi chạy hoặc thêm điểm neo vào nút không nằm trong cấu trúc phân cấp chế độ xem bằng cách sử dụng Trình tạo giao diện.

giải pháp của tôi là để thiết lập mọi thứ trong IB với UIBarButtonItem nhìn thấy và kết nối với một tài sản IBOutlet, sau đó loại bỏ nó từ thanh điều hướng ở -viewDidLoad:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    self.navigationItem.rightBarButtonItem = nil; 
} 

Sau đó, tôi chỉ cần thêm nó trở lại hoặc loại bỏ nó bằng cách nhấn vào nút khác:

- (IBAction)toggleBarButtonItem:(id)sender 
{ 
    UIBarButtonItem *item = (self.navigationItem.rightBarButtonItem == nil) ? self.popoverBarButtonItem : nil; 
    [self.navigationItem setRightBarButtonItem:item animated:YES]; 
} 

Bạn có thể giữ hoặc xóa nút theo cách tương tự theo cách tương tự -viewDidLoad. Các segue vẫn neo vào UIBarButtonItem.

2

Tôi không chắc chắn đây là chính xác những gì bạn muốn, nhưng đây là những gì tôi sẽ làm. Tạo một nút và thiết lập nó với một số mục tiêu/hành động. Gọi đó là phương pháp mục tiêu/hành động

presentPopover:(UIButton *)sender; 

Sau đó, trong phương pháp presentPopover, nói

UIViewController *customAdditionalViewController = [[MySpecialVC alloc] init]; 
//Configure the customAdditionalViewController 
//Present the customAdditionalViewController in a Popover 
UIPopoverController *popover = [[UIPopoverController alloc] initWithViewController:customAdditionalViewController]; 
//Set popover configurations 
[popover presentPopoverFromRect:sender.frame inView:self.view permittedArrowDirections:/*whatever you want*/ animated:YES]; 

Đó là cách tôi sẽ xử lý trường hợp sử dụng của bạn.

3

Tôi sẽ cố gắng làm cho một cái nhìn giả đó là kích thước và hình dạng của các quan điểm tôi muốn trình bày các popover từ, dây đó đến mục tiêu segue popover, và sau đó chuyển sang chế độ xem để đúng vị trí trong prepareForSegue:sender:

+0

Nó hoạt động! Việc ẩn chế độ xem giả cũng không có vẻ gây ra sự cố. –

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