Control Fun(4)~Action SheetとAlert

2010. 08. 14
最後に伸縮画像を使ったボタンの設置と、アクションシートとアラートの表示を行います。

676

画面下部に伸縮画像を使ったボタンを置き、このボタンをタップするとアクションシートが表示されます。

677

アクションシートはユーザに選択肢を提示して、タスクの継続を続行するか取り止めるかを問い合わせします。

取り止める場合は元に戻り、継続する場合はアラートを表示します。

678

アラートは重要な変更をする場合などに、ユーザに警告するものです。


●ボタンの設置

LibraryウィンドウからRound Rect Buttonをドラッグ&ドロップでViewウィンドウに置き、X:80、Y:403、W:160、H:37とします。

InspectorウィンドウのAttributesタブを開き、後程伸縮画像を貼り付けるため『Button』の『Type』を『Custom』にします。

『Title』は『Do Something』と設定します。

気になる方は、『View』の『Drawing』でデフォルトでチェックされているClear Context Before DrawingとAutoresize Subviewsのチェックを外してください。

『Interaction』の『User Interaction Enabled』はチェックを入れたままにします。

679

680


●アウトレットとプロパティ、アクションの宣言

パーツのレイアウトが済んだので、Interface BuilderからXcodeに戻りコードの記述を行います。

まずControl_FunViewController.hを開いて、アウトレットとプロパティ、アクションを宣言します。
(太字が追加した部分)

#import <UIKit/UIKit.h>

#define kShowSegmentIndex 0

@interface Control_FunViewController : UIViewController <UIActionSheetDelegate, UIAlertViewDelegate> {
    IBOutlet UITextField *nameField;
    IBOutlet UITextField *numberField;
    IBOutlet UILabel *sliderLabel;
    IBOutlet UISwitch *leftSwitch;
    IBOutlet UISwitch *rightSwitch;
    IBOutlet UIView *switchView;
    IBOutlet UIButton *doSomethingButton;
}
@property (nonatomic, retain) UITextField *nameField;
@property (nonatomic, retain) UITextField *numberField;
@property (nonatomic, retain) UILabel *sliderLabel;
@property (nonatomic, retain) UISwitch *leftSwitch;
@property (nonatomic, retain) UISwitch *rightSwitch;
@property (nonatomic, retain) UIView *switchView;
@property (nonatomic, retain) UIButton *doSomethingButton;

- (IBAction)textFieldDoneEditing:(id)sender;
- (IBAction)backgroundClick:(id)sender;
- (IBAction)sliderChanged:(id)sender;
- (IBAction)switchChanged:(id)sender;
- (IBAction)toggleShowHide:(id)sender;
- (IBAction)doSomething:(id)sender;

@end

681

アクションシートとアラートを実装するため、UIActionSheetDelegateプロトコルとUIAlertViewDelegateプロトコルに準拠させます。

UIAlertViewDelegateプロトコルに関しては本書中で触れられていませんし、無くてもエラー無くコンパイルも実行もできるのですが、念のため入れておきます。
(詳細は『メモ帳の作成(6)~アラート』を参照してください)

アウトレットは先程追加したボタン用にdoSomethingButtonを用意し、同名のプロパティとアクションdoSomething:も作ります。


●プロパティとアクションの実装

Control_FunViewController.mを開き、宣言したプロパティとアクションを実装します。
(太字が追加した部分)

#import "Control_FunViewController.h"

@implementation Control_FunViewController

@synthesize nameField;
@synthesize numberField;
@synthesize sliderLabel;
@synthesize leftSwitch;
@synthesize rightSwitch;
@synthesize switchView;
@synthesize doSomethingButton;

- (IBAction)doSomething:(id)sender {
    UIActionSheet *actionSheet = [[UIActionSheet alloc]
        initWithTitle:@"Are you Sure?"
        delegate:self
        cancelButtonTitle:@"No way!"
        destructiveButtonTitle:@"Yes, I'm Sure!"
        otherButtonTitles:nil];
    [actionSheet showInView:self.view];
    [actionSheet release];
}

- (void)actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex {
    if (!buttonIndex == [actionSheet cancelButtonIndex]) {
        NSString *msg = nil;

        if (nameField.text.length > 0)
            msg = [[NSString alloc]
                initWithFormat:@"You can breathe easy, %@, everything went OK.", nameField.text];
        else
            msg = @"You can breathe easy, everything went OK.";

        UIAlertView *alert = [[UIAlertView alloc]
            initWithTitle:@"Something was done"
            message:msg
            delegate:self
            cancelButtonTitle:@"Phew"
            otherButtonTitles:nil];
        [alert show];
        [alert release];
        [msg release];
    }
}

...

682

doSomething:メソッドは、Do Somethingボタンがタップされた際にアクションシートを呼び出すメソッドです。

initWithTitle:delegate:cancelButtonTitle:destructiveButtonTitle:otherButtonTitles:メソッドでアクションシートの初期化を行い、showInView:メソッドで表示します。
(両メソッドについての詳細は『メモ帳の作成(5)~アクションシート』を参照してください)

アクションシートは表示後にシステムに管理が移行するので、直後に解放しています。

actionSheet:didDismissWithButtonIndex:は、ボタンをタップしてアクションシートを画面から撤去した後に呼び出されるメソッドです。

最初にタップされたのがキャンセルボタンかどうかをcancelButtonIndexプロパティを使って判別し、キャンセルボタンであればそのままスルーし、そうでない場合は以降の処理を行います。

キャンセルボタンでない場合、まずアラートに表示するメッセージ文字列を生成します。

メッセージに使用する文字列msgは、Nameのテキストフィールドに文字が入力されているかどうかを判別し、入力されていればメッセージの内容にテキストフィールドの文字列を組み込み、そうでなければ用意した文字列を設定します。

続いて生成したメッセージ文字列を使って、アラートをinitWithTitle:message:delegate:cancelButtonTitle:otherButtonTitles:メソッドで初期化します。

showメソッドでアラートを表示した後、アラートもシステムに管理が移行するので直後に解放し、メッセージ文字列も解放します。
(両メソッドについての詳細は『メモ帳の作成(6)~アラート』を参照してください)


・actionSheet:didDismissWithButtonIndex:
(UIActionSheetDelegateプロトコル)

- (void)actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex

画面からアクションシートを撤去した後でデリゲートに送信します。

このメソッドは、アニメーションが終了し、ビューが非表示になった後で呼び出されます。

actionSheet:撤去されるアクションシートを指定します。

buttonIndex:クリックされたボタンのインデックスです。
ボタンを示す値は0から始まります。
キャンセルボタンのインデックスの場合、アクションシートはキャンセルされます。
-1の場合、キャンセルボタンのインデックスは設定されません。


・cancelButtonIndex
(UIActionSheetクラス)

@property(nonatomic) NSInteger cancelButtonIndex

キャンセルボタンのインデックス番号です。

ボタンを示す値は0から始まります。

プロパティのデフォルトの値は通常-1で、キャンセルボタンが設定されていないことを示します。

しかしinitWithTitle:delegate:cancelButtonTitle:destructiveButtonTitle:otherButtonTitles:メソッドは、自動的にキャンセルボタンの生成と設定を行います。

上記メソッドを使ってキャンセルボタンの生成をする場合は、このプロパティの値を変更しないでください。

iPadでアクションシートを提示する場合、キャンセルボタンを含めることはできません。

キャンセルボタンを含める場合の詳細は、クラスの概要(『メモ帳の作成(5)~アクションシート』)や『iOSヒューマンインターフェイスガイドライン』を参照してください。


●アウトレットとアクションの接続

Interface Builderに戻り、DocumentウィンドウでFile's Ownerを選択し、InspectorウィンドウのConnectionsタブを開きます。

『Outlets』の『doSomethingButton』と『Received Actions』の『doSomething:』をViewウィンドウのDo Somethingボタンに接続します。
(アクションの接続では『Touch Up Inside』を選択します)

683

この状態でも機能上は動作しますが、Do Somethingボタンが背景の無い状態ですので、伸縮画像を使って背景画像を設定します。

684


●ボタンへの伸縮画像の設定

今回使用するボタンの背景画像は、本書中で紹介されているiOS Reference Libraryのサンプルコード『UICatalog』のものを利用します。
Apress社のサイト内にサンプルコードの『Beginning iPhone Development Projects Oct 12 2009/04 Control Fun』にも同じ画像ファイルはあります)

UICatalogの場合、『Download Sample Code』ボタンを押してダウンロードし、生成されるUICatalogフォルダ下のimagesフォルダにあるblueButton.pngとwhiteButton.pngを、自身のControl Funプロジェクトのフォルダにコピーし、XcodeのResourcesに追加します。

使用する画像ファイルをプロジェクトに追加しましたら、Control_FunViewController.mを開き、コメントアウトされているviewDidLoadメソッドを有効にします。
(太字が追加した部分)

- (void)viewDidLoad {
    [super viewDidLoad];
    UIImage *buttonImageNormal = [UIImage imageNamed:@"whiteButton.png"];
    UIImage *strechableButtonImageNormal = [buttonImageNormal stretchableImageWithLeftCapWidth:12 topCapHeight:0];
    [doSomethingButton setBackgroundImage:strechableButtonImageNormal forState:UIControlStateNormal];
    UIImage *buttonImagePressed = [UIImage imageNamed:@"blueButton.png"];
    UIImage *strechableButtonImagePressed = [buttonImagePressed stretchableImageWithLeftCapWidth:12 topCapHeight:0];
    [doSomethingButton setBackgroundImage:strechableButtonImagePressed forState:UIControlStateHighlighted];
}

685

viewDidLoadメソッドには、nibファイルをメモリに読み込んだ(展開した)後に追加する処理を記述します。

本書では触れられていませんが、自動で記述されているスーパークラスによる初期化はそのまま残しておきます。

imageNamed:メソッドで指定したファイル名の画像を読み込み、stretchableImageWithLeftCapWidth:topCapHeight:メソッドで伸縮画像を生成して、setBackgroundImage:forState:で通常時および強調表示時のボタンの背景画像として設定します。
(3つのメソッドの詳細は『スライドショーのメソッド(1)』『スライドショーのメソッド(2)』を参照してください)

保存してビルドと実行を行い動作を確認してください。

686

・viewDidLoad
(UIViewControllerクラス)

- (void)viewDidLoad

コントローラのビューをメモリに読み込んだ後で呼び出されます。

このメソッドは、ビューコントローラの持つ関連付けされたビューをメモリに読み込んだ後で呼び出されます。

このメソッドは、ビューがnibファイルに格納されている、またはloadViewメソッドでプログラムによって生成されるかどうかに関係なく呼び出されます。

このメソッドは、nibファイルから読み込んだビューに初期化行程を追加する際に、もっとも一般的に使用されます。



参考文献

UIActionSheetDelegate Protocol Reference

UIActionSheet Class Reference

UIViewController Class Reference

はじめてのiPhone3プログラミングはじめてのiPhone3プログラミング
(2009/12/17)
Dave Mark、Jeff LaMarche 他

商品詳細を見る






コンパニオン20
0 Comments
Leave a comment
管理者にだけ表示を許可する
Top
0 Trackbacks
Top
Calendar
03 | 2017/04 | 05
Sun Mon Tue Wed Thu Fri Sat
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 - - - - - -
Recent Articles
iTunes


Swift
Categories
Tips
Profile

水月杏香

Author:水月杏香
永遠の初心者プログラマ。

Wish List
WACOM


ARC
Technical Q&A
情報プロパティリストキー
Start Developing iOS Apps Today
BOSE

コンパニオン20
Reference
NSApplicationDelegateプロトコル
NSArrayクラス
NSAutoreleasePoolクラス
NSBundleクラス
NSBundle UIKit追加分
NSCalendarクラス
NSCoderクラス
NSCodingプロトコル
NSCopyingプロトコル
NSDataクラス
NSDateクラス
NSDateFormatterクラス
NSDictionaryクラス
NSEntityDescriptionクラス
NSEnumeratorクラス
NSErrorクラス
NSExceptionクラス
NSFetchRequestクラス
NSFileHandleクラス
NSFileManagerクラス
NSIndexPathクラス
NSIndexPath UIKit追加分
NSKeyedArchiverクラス
NSKeyedUnarchiverクラス
NSKeyValueCodingプロトコル
NSLocaleクラス
NSManagedObjectクラス
NSManagedObjectContextクラス
NSManagedObjectModelクラス
NSMutableArrayクラス
NSMutableCopyingプロトコル
NSMutableDictionaryクラス
NSMutableSetクラス
NSNotificationクラス
NSNotificationCenterクラス
NSNullクラス
NSNumberクラス
NSObjectクラス
NSObject UIKit追加分
NSObjectプロトコル
NSPersistentStoreクラス
NSPersistentStoreCoordinatorクラス
NSPredicateクラス
NSPropertyListSerializationクラス
NSRunLoopクラス
NSSetクラス
NSStringクラス
NSString UIKit追加分
NSTimerクラス
NSTimeZoneクラス
NSURLクラス
NSURLProtectionSpaceクラス
NSURLRequestクラス
NSUserDefaultsクラス
NSValueクラス

UIActionSheetクラス
UIActionSheetDelegateプロトコル
UIActivityIndicatorViewクラス
UIAlertViewクラス
UIAlertViewDelegateプロトコル
UIApplicationクラス
UIApplicationDelegateプロトコル
UIBarButtonItemクラス
UIBarItemクラス
UIButtonクラス
UIColorクラス
UIControlクラス
UIDatePickerクラス
UIDeviceクラス
UIEventクラス
UIFontクラス
UIGestureRecognizerクラス
UIImageクラス
UIImageViewクラス
UIKit Function
UILabelクラス
UINavigationControllerクラス
UINavigationItemクラス
UIPickerViewクラス
UIPickerViewDataSourceプロトコル
UIPickerViewDelegateプロトコル
UIPinchGestureRecognizerクラス
UIResponderクラス
UIScreenクラス
UIScrollViewクラス
UISearchBarクラス
UISearchBarDelegateプロトコル
UISegmentedControlクラス
UISliderクラス
UISwipeGestureRecognizerクラス
UISwitchクラス
UITableViewクラス
UITableViewCellクラス
UITableViewControllerクラス
UITableViewDataSourceプロトコル
UITableViewDelegateプロトコル
UITapGestureRecognizerクラス
UITextFieldクラス
UITextFieldDelegateプロトコル
UITextInputTraitsプロトコル
UITextViewクラス
UITextViewDelegateプロトコル
UIToolbarクラス
UITouchクラス
UIViewクラス
UIViewControllerクラス
UIWebViewクラス
UIWebViewDelegateプロトコル
UIWindowクラス

AVAudioPlayerクラス
AVAudioPlayerDelegateプロトコル

CADisplayLinkクラス
CAEAGLLayerクラス
CALayerクラス

CGAffineTransform
CGBitmapContext
CGColor
CGColorSpace
CGContext
CGGeometry
CGImage
CGPath

EAGLContextクラス
EAGLDrawableプロトコル

Foundation Constants
Foundation Data Types
Foundation Functions

MPMediaItemクラス
MPMediaItemArtworkクラス
MPMediaPlaylistクラス
MPMediaPropertyPredicateクラス
MPMediaQueryクラス
MPMusicPlayerControllerクラス

Randomization Services

System Sound Services
Amazon


OpenGL ES
SQLite
Monthly Archives
Recent Comments
Recent TrackBacks
RSS Link
Visitors
QR Code
QR