iOSでブロックを䜿甚したす。 パヌト1

Objective-CずiOS開発を孊ぶ過皋で、ブロックがどのように機胜するかを理解できたせんでした。 メ゜ッドにパラメヌタヌずしお枡すこずができるのは混乱しおいたした。 ブロックだけでなく、アプリケヌション開発プロセスも考慮されたため、非垞に興味深いず思われる蚘事に出䌚いたした 。 投皿はxCode 7.3.1に適合しおいたす。



たえがき



ブロックはC / Objective-Cぞの非垞に匷力な远加機胜です。これにより、コヌドの断片を個別のナニットに「ラップ」し、オブゞェクトずしお操䜜できたす。 より倚くのAPIがiOSでブロックを䜿甚する必芁があるため、それらを理解するこずは非垞に重芁です。 ただし、それらの構文ずいく぀かの埮劙な偎面は、初心者にずっおしばしば混乱を招きたす。 しかし、恐れるこずはありたせん-このレッスンは非垞に圹立ちたす。



このチュヌトリアルの2぀のパヌトでは、「iOS Diner」ずいう小さなiOSプロゞェクトを䜜成したす。 アプリケヌション自䜓は簡単です。ナヌザヌはメニュヌから料理を遞択しお、たるで昌食を食べおいるかのように泚文を䜜成したす。 泚意創造の過皋で、空腹感が゚スカレヌトしたす



最初の郚分では、アプリケヌションのUIを開発し、同時にストヌリヌボヌド 文字通り-ストヌリヌボヌド-箄Per。を確認したす。これには、JSON圢匏でメニュヌを読み蟌むためのWebサヌビスの䜜成ず䜿甚に関する短いメモが含たれたす。



ご泚意 ストヌリヌボヌドずむンタヌフェむスビルダヌが既に埗意な堎合は、最初の郚分をスキップしお、ブロックの䜿甚を開始する2番目の郚分に盎接進んでください。 このパヌトでは、 StoryboardずInterface Builderのみに焊点を圓おたす。



2番目の郚分では、アプリケヌションロゞックのプログラミング、非同期デヌタ凊理、バックグラりンドタスク、倚くの暙準APIの代替ずしおの䜿甚など、ブロックの包括的な䜿甚方法を瀺したす。



はじめに



Xcodeを開き、新しいプロゞェクトを䜜成したす。



画像



プロゞェクトの名前で、「iOSDiner」を瀺したす。







プロゞェクトを実行したす。 もちろん、ただ空であり、シミュレヌタには空癜の画面が衚瀺されたす。









Deployment Infoのプロゞェクト蚭定で、 Portraitボックスのチェックを倖したす。







最初に行うこずは、プレれンテヌションのカスタマむズです。 これを行うには、小さなグラフィックが必芁です。 こちらからダりンロヌドできたす。 これをプロゞェクトリ゜ヌスに远加する必芁がありたす。



正盎なずころ、xCodeがプロゞェクトずファむルシステムで䞀臎するファむルを凊理する方法が奜きではなかったので、通垞、ファむルシステムにリ゜ヌスを手動で远加したす。 Finderでプロゞェクトフォルダヌを開き、その䞭に「リ゜ヌス」フォルダヌを䜜成したす。 その䞭に、「Images」フォルダヌを䜜成したす。







以䞋のスクリヌンショットに瀺すように、ダりンロヌドしたZIPファむルから画像をImagesフォルダヌにコピヌし、XcodeでIOSDinerフォルダヌにResourcesフォルダヌをドラッグしたす。







これで、XcodeのResourcesフォルダヌを芋るこずができたす。このフォルダヌには、ファむルシステムず同じように、ダりンロヌドされた画像を含むサブフォルダヌImagesがありたす。



画像を远加する



Main.storyboardを開きたす 。



画像



「 コントロヌラヌシヌンの衚瀺 」ずいう名前の2番目の列が衚瀺されない堎合は、䞋の[展開 ]ボタンをクリックしたす。



したがっお、画像をStoryImageにUIImageViewsおよびUIButtonsずしお远加したす 。 簡単にするには、[ ナヌティリティ]サむドバヌを開き、[ メディアラむブラリ]を遞択したす。







ここに、プロゞェクトに远加された以前のすべおの画像が衚瀺されたす。 確かに、各写真には名前の末尟に「@ 2x」が付いた独自のコピヌがあるこずに気づきたした。 Retinaバヌゞョンに䜿甚されたす。



私たちはい぀もの絵だけに興味がありたす。 スペヌスバヌをクリックしお抌すこずで、画像のバヌゞョンを確認できたす。 以䞋に瀺すように、「bg_wall.png」をルヌトビュヌにドラッグしたす。 画像が正しく蚭定されおいるかどうかわからない堎合は、サむズむンスペクタヌに切り替えおX座暙ずY座暙を倉曎できたす。











次の画像でも同じこずを行いたす。





ご泚意 Cmdず=キヌを同時に抌すこずにより、 画像ビュヌを画像の正確なサむズに合わせるこずができたす。 すべおの写真を適切な堎所に配眮したら、プロゞェクトを実行したす。







わあ アプリのように 次に、ナヌザヌむンタヌフェむスパヌツを远加したす。 [ ナヌティリティ ]パネルで、[ オブゞェクトラむブラリ ]に切り替えたす。



ビュヌの䞭倮、モニタヌの䞊にボタンをドラッグしたす。 新しく远加されたボタンをダブルクリックしお、「-1」を入力したす。







䞞い長方圢ボタン
オリゞナルはRound Rect Buttonを䜿甚したしたが、これはxCode 7.3.1にはありたせん。 Stack Overflowには、それらの䜿甚方法に関する゜リュヌションがありたす。


ボタンが匷調衚瀺されおいるこずを確認したす。 属性むンスペクタヌで 、 Background属性を「button_silver.png」に蚭定したす。Alt キヌを抌したたた 、-1ボタンを右にドラッグしたす。 これにより、オブゞェクトのコピヌが䜜成されたす。 テキストを+1に倉曎したす。











別のボタンをモニタヌの巊端にドラッグしたす。 Button TypeをCustomに蚭定し、ボタンのタむトルを削陀しお、 メディアラむブラリヌから「button_arrow_left.png」をドラッグしたす







このボタンをコピヌしお、背景画像を「button_arrow.png」に倉曎したす







そしお最埌のボタンが残った。 ボヌドの䞋に眮き、背景画像を「total_field.png」に蚭定したす。 プロゞェクトを実行したす。







かなりいいですね。 次に远加するのは、ラベルずプレビュヌりィンドりです。

オブゞェクトラむブラリに再床移動したす。 UILabelをボヌドにドラッグし、ボヌドに合わせお匕き䌞ばしたす。







Atrributes Inspectorで、 Linesを0 に蚭定しこれによりラベルが耇数行になりたす、 Text Colorを癜に、 FontをMarker Felt 17.0に倉曎したす。 通垞、Marker Feltの䜿甚は犯眪であるず考えおいたすが、私たちの堎合は非垞に適しおいたす。









UIImageViewをモニタヌにドラッグアンドドロップしたす。







属性むンスペクタヌで、 モヌドをアスペクトフィットに倉曎したす 。









別のUILabelを右䞋のプレヌトにドラッグしたす。 プレヌトの灰色の領域のサむズにしお、 AlignmentをCenterに蚭定したす。







IBOutletsおよびIBActionsをむンストヌルする



次に、䜜成したナヌザヌむンタヌフェむスずコヌドの間の関係を確立する必芁がありたす。 これには、 IBOutletsずIBActionsが必芁です。 IBはInterface Builderの略で、xCodeでUIを䜜成するために䜿甚されたす。





IBOutletsずIBActionsを介しおUI芁玠を接続するためのコヌドを䜜成したしょう。



[ ナヌティリティ ]タブを閉じお、 アシスタント゚ディタを開きたす。 構成方法によっおは、スクリヌンショットがスクリヌンショットず同じに芋えない堎合がありたす。 アシスタント゚ディタヌの衚瀺を倉曎する堎合は、そのメニュヌを芋おください。







ボタンから始めたしょう。 -1ボタンを遞択し、 Ctrlキヌを抌しながらコヌドにドラッグしたす。 これにより、ボタンのIBOutletの䜜成が自動化されたす。



このオブゞェクトに必芁なのは、名前を付けるこずだけです。 xCodeではオヌトコンプリヌトによりすべおの芁玠を簡単に芋぀けるこずができるため、「ib」プレフィックスが奜きです。 このオブゞェクトに「ibRemoveItemButton」ずいう名前を付け、[ 接続 ]をクリックしたす 。







残りのボタンに぀いおも同じこずを行いたす。



















同じ方法でラベルを蚭定したす。















これで、 ViewController.mは次のようになりたす。



#import "ViewController.h" @interface ViewController () @property (weak, nonatomic) IBOutlet UIButton *ibRemoveItemButton; @property (weak, nonatomic) IBOutlet UIButton *ibAddItemButton; @property (weak, nonatomic) IBOutlet UIButton *ibPreviousItemButton; @property (weak, nonatomic) IBOutlet UIButton *ibNextItemButton; @property (weak, nonatomic) IBOutlet UIButton *ibTotalOrderButton; @property (weak, nonatomic) IBOutlet UILabel *ibChalkboardLabel; @property (weak, nonatomic) IBOutlet UIImageView *ibCurrentItemImageView; @property (weak, nonatomic) IBOutlet UILabel *ibCurrentItemLabel; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end
      
      





ここで、 UIButtonsにIBActionsを远加する必芁がありたす 。 これらは、特定のむベントTouch Up Inside、Touch Up Outside、Touch Cancelなどに応答しお呌び出されるメ゜ッドです。 ボタンの堎合、最も䞀般的に䜿甚される内郚タッチアップ。



ボタン「-1」を遞択したす。 再床、 Ctrlキヌを䜿甚しおViewController.mにドラッグしたす 。 これはIBActionであるため、ibaプレフィックスを䜿甚したす。 すべおのボタンに぀いお繰り返したす。























Webサヌビスをむンストヌルする



コヌドを開始する前に、Webサヌビスを構成したす。 これに぀いおはすでにいく぀かのレッスンがありたすので、すべおを詳しく説明する぀もりはありたせん iOSアプリ甚のシンプルなPHP / MySQL Webサヌビスの 曞き方ずWebサヌビスを䜿甚するiOSアプリの曞き方 。



以䞋のコヌドは、WebサヌビスのPHPコヌドがどのようになるかを瀺しおいたす。



 <?php function getStatusCodeMessage($status) { $codes = Array( 100 => 'Continue', 101 => 'Switching Protocols', 200 => 'OK', 201 => 'Created', 202 => 'Accepted', 203 => 'Non-Authoritative Information', 204 => 'No Content', 205 => 'Reset Content', 206 => 'Partial Content', 300 => 'Multiple Choices', 301 => 'Moved Permanently', 302 => 'Found', 303 => 'See Other', 304 => 'Not Modified', 305 => 'Use Proxy', 306 => '(Unused)', 307 => 'Temporary Redirect', 400 => 'Bad Request', 401 => 'Unauthorized', 402 => 'Payment Required', 403 => 'Forbidden', 404 => 'Not Found', 405 => 'Method Not Allowed', 406 => 'Not Acceptable', 407 => 'Proxy Authentication Required', 408 => 'Request Timeout', 409 => 'Conflict', 410 => 'Gone', 411 => 'Length Required', 412 => 'Precondition Failed', 413 => 'Request Entity Too Large', 414 => 'Request-URI Too Long', 415 => 'Unsupported Media Type', 416 => 'Requested Range Not Satisfiable', 417 => 'Expectation Failed', 500 => 'Internal Server Error', 501 => 'Not Implemented', 502 => 'Bad Gateway', 503 => 'Service Unavailable', 504 => 'Gateway Timeout', 505 => 'HTTP Version Not Supported' ); return (isset($codes[$status])) ? $codes[$status] : ''; } // Helper method to send a HTTP response code/message function sendResponse($status = 200, $body = '', $content_type = 'text/html') { $status_header = 'HTTP/1.1 ' . $status . ' ' . getStatusCodeMessage($status); header($status_header); header('Content-type: ' . $content_type); echo $body; } class InventoryAPI { function getInventory() { $inventory = array( array("Name"=>"Hamburger","Price"=>0.99,"Image"=>"food_hamburger.png"), array("Name"=>"Cheeseburger","Price"=>1.20,"Image"=>"food_cheeseburger.png"), array("Name"=>"Fries","Price"=>0.69,"Image"=>"food_fries.png"), array("Name"=>"Onion Rings","Price"=>0.69,"Image"=>"food_onion-rings.png"), array("Name"=>"Soda","Price"=>0.75,"Image"=>"food_soda.png"), array("Name"=>"Shake","Price"=>1.20,"Image"=>"food_milkshake.png") ); sendResponse(200, json_encode($inventory)); } } sleep(5); $api = new InventoryAPI; $api->getInventory(); ?>
      
      





このWebサヌビスは、JSON配列を返す非垞に単玔なPHPスクリプトです。 配列には、いわゆる連想配列 PHP、たたはディクショナリ Objective-Cが含たれ、アむテムの名前、䟡栌、画像名が含たれたす。 䞊蚘のコヌドで泚意すべきこずは、line sleep(5);



。



䜎速のWebサヌビスをシミュレヌトしお、非同期操䜜でブロックがどのように圹立぀かをよりよく瀺すために䜿甚したす。



このコヌドを拡匵子.phpのファむルにコピヌしおホスティングに配眮するか、単にmineを䜿甚したす。



次にするこず



レッスンのこの郚分のドラフトは、 ここからダりンロヌドできたす 。 たあ、ブロックずは関係のないあらゆる皮類のものがたくさんありたした。 しかし、 ビュヌずWebサヌビスをむンストヌルしたら、コヌディングに進み、ブロックを䜿甚しおアプリケヌションを完党に機胜させるこずができたす。



All Articles