2011-10-29 41 views
4

我剛開始學習使用MonoTouch開發應用程序(主要)爲iPad。也許是因爲我在C#世界多年的經驗,這使我的轉換非常困難,有時候我感到很蠢。這在C#中是非常簡單的事情,但它讓我從頭開始...MonoTouch for iPad:如何顯示彈出對話框?

彈出對話框?

對於iPhone而言,您很少有這個需求,因爲無論您展示什麼都會佔據整個屏幕,所以您只需爲每個彈出框創建一個控制器。

對於iPad,我有更多的空間,我不希望整個屏幕被一些控件佔用(例如登錄屏幕)。這就是爲什麼我想將它顯示爲彈出窗口。我在其他iPad應用程序中看到了這一點。

從我學到的東西,我需要使用UIAlertView或UIActionSheet來做到這一點。但是我不明白的是,正如我讀過的所有例子所顯示的那樣,你必須從代碼中創建所有的控件。

我想要做的是使用IB創建UI,並將其插入UIActionSheet。可能嗎?我該怎麼做?

回答

6

如果這是僅限iPad的應用程序,則需要使用UIPopoverController。這是一個彈出的「窗口」,其中包含一個視圖並鏈接到屏幕上的某個區域,如工具欄按鈕或矩形(如UIButton的框架)。

要使用這個,使用接受UIViewController的構造函數創建一個UIPopoverController的新實例,並傳遞要顯示的視圖。

由於垃圾回收的考慮,請確保您將UIPopoverController存儲在類級屬性中。

當popover關閉時,您可能還想要清理此屬性。爲了支持這個,我們對UIPopoverController進行了子類化,添加了一個可以被調用者鉤住的事件,然後覆蓋Dismiss方法並在重寫的方法中觸發掛鉤的事件(如果有的話)。

一旦你實例化彈出窗口,你會想顯示它。您可以通過PresentFromxxx方法之一來完成此操作。如果你從一個按鈕(而不是工具欄)顯示這個,你可以使用按鈕的框架作爲矩形來調用PresentFromRect。

呈現的視圖可以通過在其ViewDidLoad方法中設置ContentSizeForViewInPopover屬性來控制其大小。

+0

非常感謝。這正是我正在尋找的。 – newman

+0

由於某些原因,我不會收到Dismiss事件。我需要做任何事情來完成這個事件嗎?或者我必須繼承UIPopoverController以覆蓋Dismiss方法? – newman

+0

如果您以編程方式關閉對話框,則不會觸發Dismiss事件(我發現它被埋在Apple文檔的某處)。這就是爲什麼我們結束了控制器的子類化並覆蓋了Dismiss方法。 –

1

您無法從Interface Builder編輯UIActionSheet或UIAlertView。

你可以做的是在界面生成器中創建一個視圖,並以模態方式在其他視圖之上顯示它,但是它聽起來像你不想佔據整個屏幕,這將會發生什麼。這裏是一個模式視圖控制器的例子:http://pastebin.com/h221BQdK

我認爲你應該只是按照你提到的例子,並從代碼創建一個UIAlertView,也許把它放在一個靜態工具類。我創建了一個MessageBox類,使其更像Windows,但您也可以在其上放置文本框進行登錄。看看應用商店的登錄框,它是一個很好的例子。

+0

非常感謝你爲你的提示。雖然這並沒有完全回答我的問題,但它絕對有幫助。 – newman

0

創建名爲extraviewcontroller的視圖控制器,將其高度寬度設置爲300 * 215。 和下面寫

inviewdidload

pickerviewTitle = [[UIPickerView alloc] initWithFrame:CGRectMake(0,0, 383, 250)]; 
pickerviewTitle.delegate = self; 
pickerviewTitle.tag = 0; 
pickerviewTitle.showsSelectionIndicator = YES; 

controller = [self.storyboard instantiateViewControllerWithIdentifier:@"ExtraViewController"]; 
popovercontroller = [[UIPopoverController alloc] initWithContentViewController:controller]; 
popovercontroller.delegate = self; 

的代碼,然後

UIActionSheet *actionSheet1 = [[UIActionSheet alloc] initWithTitle:@"Title" delegate:self cancelButtonTitle:@"Done" destructiveButtonTitle:nil otherButtonTitles:nil]; 
actionSheet1.tag = 0; 
actionSheet1.actionSheetStyle = UIActionSheetStyleDefault; 
[actionSheet1 addSubview:pickerviewTitle]; 
[actionSheet1 setFrame:CGRectMake(0, 0, 600, 400)]; 

[controller.view addSubview:actionSheet1]; 


if ([popovercontroller isPopoverVisible]) { 
    [popovercontroller dismissPopoverAnimated:YES]; 
} else { 

    //the rectangle here is the frame of the object that presents the popover, 
    //in this case, the UIButton… 

    CGRect convertedFrame = yourclickbutton.frame; 


    [popovercontroller presentPopoverFromRect:convertedFrame 
             inView:self.view 
        permittedArrowDirections:UIPopoverArrowDirectionRight 
            animated:YES]; 

}