2011-10-16 56 views
20

這可能是不可能的,但我希望有人會有一個想法如何做到這一點。創建按鈕彈出視圖錨在運行時

我有一個應用程序,我只從iPhone移植到Universal。在iPhone上,我使用的是選項卡式應用程序。我使用三個標籤來顯示普通數據。我有第四個選項卡,只有在滿足特定條件時纔會顯示。要添加標籤,我做的:

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]; 
} 

對於iPad的,我對最初的觀點足夠的空間來從iPhone UI的主要三個標籤顯示的一切。所以我需要的是一個額外的(小)視圖的「額外」數據。我想使用popOver視圖來完成它,所以我使用Utility App模板中的導航欄和彈出按鈕來設置初始視圖。但現在我卡住了。我無法弄清楚如何在運行時創建popover按鈕,並使其正確執行popOver視圖。我可以添加按鈕,像這樣:

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

,但我得到一個異常:「NSInternalInconsistencyException」,原因:「UIStoryboardPopoverSegue必須從一個欄按鈕項或圖中呈現」我很確定這是因爲我沒有爲popOver segue設置錨點。故事板中不存在該按鈕,所以我無法將其設置在那裏。我似乎無法找到一個API來設置它在運行時。

我也嘗試在IB中創建按鈕,但不是在視圖層次結構中,然後將rightBarButtonItem屬性設置爲我現有的按鈕。這也行得通,但我仍然無法將該按鈕設置爲彈出視圖的錨點。我可以將導航欄設置爲定位點,但這使得它定位到導航欄中的標題,看起來很愚蠢。

任何想法?

+0

嘿@Flyingdiver你找到了解決辦法嗎? – Rog

+0

是的,製作一個隱藏的UIView,從中展示彈出窗口並移動到需要的地方。 –

回答

13

我有同樣的問題,並通過在視圖控制器的Storyboard中創建一個UIBarButtonItem而不是視圖層次結構的一部分來解決它。

在IB中,將一個欄按鈕項拖到視圖控制器視圖下方的黑條中,將其放在「First Responder」和「View Controller」圖標旁邊。爲它創建一個(強)IBOutlet。然後通過從條形按鈕項目拖動到目標,從其中創建一個彈出窗口到目標視圖控制器。似乎這是將其設置爲主播的唯一方法。選擇它作爲現有segue的錨不起作用(看起來像一個IB bug)。

enter image description here

在viewDidLoad中(無論你喜歡或者),您可以指定這個欄按鈕項目的navigationItem和SEGUE按預期工作。

3

我也很好奇,所以我做了一個快速測試項目。你是對的,似乎沒有辦法在運行時配置popover segue,或者使用Interface Builder將一個錨點添加到不在視圖層次結構中的按鈕。

我的解決辦法是在IB來設置一切與UIBarButtonItem可見,並且連接到IBOutlet屬性,然後從導航欄-viewDidLoad其刪除:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    self.navigationItem.rightBarButtonItem = nil; 
} 

然後,我只是將其重新添加或刪除其通過點擊另一個按鈕:

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

你可以有條件地保留或刪除-viewDidLoad按鈕以同樣的方式。該segue仍然錨定到UIBarButtonItem

2

我不確定這正是你想要的,但這是我會做的。創建一個按鈕,並設置一些目標/動作。呼叫目標/行動方法

presentPopover:(UIButton *)sender; 

然後在presentPopover方法,說

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]; 

這就是我將如何處理您的使用案例。

3

我要去嘗試進行虛擬視圖這就是我想從,線呈現酥料餅是給SEGUE酥料餅的目標,然後將欣賞到正確的位置在prepareForSegue:sender:

視圖的大小和形狀
+0

它的工作原理!隱藏虛擬視圖也不會導致問題。 –