en

hi, it seems you are using microsoft internet explorer. it doesn't match web standard and causes problems browsing this site. please please please use mozilla firefox or google chrome instead. thank you!

zh

哦哦!您正在使用Internet Explorer 瀏覽器,它與我們的網頁標準並不相容,可能會導致畫面顯示不正常。
請改用 Mozilla Firefox 或者 Google Chrome 才能正常瀏覽本網站,謝謝!

6.21.2011

UIActionSheet  的使用方法

    

 UIActionSheet 是一個由下往上彈出的選單,它的功能和使用方法都類似於 Alerts,但是還是有些微不同,下面就示範如何使用 UIActionSheet 來製作選單,請看以下程式碼。

在使用 UIActionSheet 之前,請先為您的程式加上代理,本示範是在 ViewController 中加入代理。

@interface UIActionSheetViewController : UIViewController<UIActionSheetDelegate> {

}

接下來就是在按鈕事件加入產生 UIActionSheet 的程式碼。

- (IBAction)onMenuButton:(id)sender {
    UIActionSheet *actionSheet = [[[UIActionSheet alloc]initWithTitle:@"請選擇聯絡方式"
                                                        delegate:self
                                                        cancelButtonTitle:@"還是算了"
                                                        destructiveButtonTitle:@"特殊紅色選項"
                                                        otherButtonTitles:@"電話", @"E-Mail", nil]
                                  autorelease];

    //也可以透過此方式新增按鈕
    [actionSheet addButtonWithTitle:@"MSN"];

    //將actionSheet顯示於畫面上
    [actionSheet showInView:self.view];
}

上述程式碼在設定方面大致都與 Alerts 相通,值得注意的是 UIActionSheet 並沒有辦法設定 message: 內文,並且多了一個紅色的特殊造型按鈕 destructiveButtonTitle:,在增加新的按鈕時也是從最下方加入,關於不同的地方大家可以參考Alerts 警告訊息的使用方法一文。

至於所觸發的按鈕事件寫法就與 Alerts 一模一樣了,同都是呼叫一個內建函式,使用索引 Index 並配合按鈕標題來做判斷。

//判斷ActionSheet按鈕事件
- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {

    //將按鈕的Title當作判斷的依據
    NSString *title = [actionSheet buttonTitleAtIndex:buttonIndex];

    if([title isEqualToString:@"電話"]) {
        contentLabel.text = @"可惜我們目前還沒有電話";
    }

    else if([title isEqualToString:@"E-Mail"]) {
        contentLabel.text = @"furnacedigital@gmail.com";
    }

    else if([title isEqualToString:@"MSN"]) {
        contentLabel.text = @"可惜我們目前還沒有MSN";
    }
}

最後如同 Alerts 使用方式一般,在不想出現的欄位也可以填上 nil 值,用來製作出不同的 UIActionSheet 風格。

- (IBAction)onAboutUsButton:(id)sender {

NSString *aboutString = @"鑫穎數位工作室 Furnace Digital Collaboration \n\nWe Are Furnace and Never Stop Burning...\n\n\nfurnacedigital@gmail.com";

    UIActionSheet *actionSheet = [[[UIActionSheet alloc]initWithTitle:aboutString
                                                        delegate:nil
                                                        cancelButtonTitle:@"返回"
                                                        destructiveButtonTitle:nil
                                                        otherButtonTitles:nil]
                                  autorelease];

[actionSheet showInView:self.view];
}






4 則留言:

  1. 你好
    問一個很奇怪的問題
    我在ipad上使用UIActionSheet
    照您上面的方法去宣告
    UIActionSheet *actionSheet = [[UIActionSheet alloc]initWithTitle:@"請選擇聯絡方式"
    delegate:self
    cancelButtonTitle:@"還是算了"
    destructiveButtonTitle:@"特殊紅色選項"
    otherButtonTitles:nil];

    然後我把 [actionSheet addButtonWithTitle:@"MSN"]; 註解掉

    可是這樣的話actionsheep只有出現@"特殊紅色選項" 沒有出現cancel 的按鈕

    我把 [actionSheet addButtonWithTitle:@"MSN"];加回去以後
    就有cancel @"還是算了" 的按鈕了
    請問可以幫我解答一下嗎.....感謝

    回覆刪除
    回覆
    1. 你好 henry:

      關於你的問題,其實並不奇怪啦!
      這是因為 UIActionSheet 在 iphone 和 ipad 中在實作上是由兩個完全不同的方法所產生的,「取消」的按鈕消失,其實並不是 bug。

      在 iPAD 上呼叫 UIActionSheet 之後,整個畫面的 focus 都會在 UIActionSheet,但是當你點其畫面的其他地方(非 UIActionSheet View)本身時,UIActionSheet 就會消失,這類的操作如同你點擊「取消按鈕」一般,因此在 iPAD 上使用上述程式碼在建立 UIActionSheet 時,「取消按鈕」這部份會直接被略過,就如同 apple 的設計理念一樣,介面越簡潔越好,正如你不會為你的應用程式去設計一個「退出」的按鈕一樣。

      另一方面,回到你的問題,在你增加 [actionSheet addButtonWithTitle:@"MSN"]; ,替之 UIActionSheet 增加一個新的按鈕之後,為什麼又會出現「取消按鈕」,我只能說,這只是一個美麗的誤會,因為當你的「取消按鈕」如果是在最末端(預設值),它理所當然會被忽略掉,不產生,但是你使用了 addButtonWithTitle: 方法去增加一個全新的按鈕在「取消按鈕」之後,那麼它就會把你最後一新增的按鈕當做是「取消按鈕」而不去繪製它。

      由於我沒有辦法看到 UIActionSheet.m 這個實作檔,所以也只能初步推測,在 iPAD 的環境下,它總是會省略繪製最後一個按鈕,因為通常「取消按鈕」會是在整個 UIActionSheet 的最後面,我自己經過幾次的實驗也是得到類似的結果。

      刪除
  2. 感謝回答!懂了:)

    回覆刪除