第一个iOS程序

1月19日开始第一个ios开发程序。

在Xcode4.2下创建一个SingleView Application项目first

Device Family: iPhone Use Storyboard Use Automatic Reference Counting

进入first项目根目录,有两个目录first和first.xcodeproj。进入first目录。

查看文件:

$ cd first
$ ls
AppDelegate.h ViewController.h en.lproj first-Prefix.pch
AppDelegate.m ViewController.m first-Info.plist main.m

Storyboard在这里:

$ ls en.lproj/
InfoPlist.strings MainStoryboard.storyboard

Storyboard的层次结构:

document
dependencies
scenes
scene
objects
placeholder
viewController
view
rect
autoresizingMask
subviews
color
connections
outlet
classes(一开始木有)
simulatedMetricsContainer

添加一个Label

-                        <subviews/>
+ <subviews>
+ <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Label" lineBre
+ <rect key="frame" x="139" y="20" width="42" height="21"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+ <fontDescription key="fontDescription" type="system" pointSize="17"/>
+ <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
+ <nil key="highlightedColor"/>
+ </label>
+ </subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
</view>
</viewController>
</objects>
</scene>
</scenes>
+ <classes>
+ <class className="ViewController" superclassName="UIViewController">
+ <source key="sourceIdentifier" type="project" relativePath="./Classes/ViewController.h"/>
+ </class>
+ </classes>

做了2件事:

  1. 在subviews里增加了label,设置了相关属性。
  2. 在document下,scenes后增加了classes元素,关联到了ViewController.h文件,来做以后的事件处理。

设置Outlet关联

修改了如下3个文件:

#       modified:   ViewController.h
# modified: ViewController.m
# modified: en.lproj/MainStoryboard.storyboard

先看Storyboard

--- a/first/en.lproj/MainStoryboard.storyboard
+++ b/first/en.lproj/MainStoryboard.storyboard
@@ -23,6 +23,9 @@
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
</view>
+ <connections>
+ <outlet property="statusLabel" destination="qCc-nf-TgC" id="b2g-zn-NAy"/>
+ </connections>
</viewController>
</objects>
</scene>
@@ -30,6 +33,9 @@
<classes>
<class className="ViewController" superclassName="UIViewController">
<source key="sourceIdentifier" type="project" relativePath="./Classes/ViewController.h"/>
+ <relationships>
+ <relationship kind="outlet" name="statusLabel" candidateClass="UILabel"/>
+ </relationships>
</class>
</classes>

也做了2件事:

  1. 增加connections元素,设置outlet关联到前面的label:outlet.destination == label.id
  2. 增加relationships元素,添加子节点relationship,kind为outlet。

再看ViewController.h。增加了一行:

@property (strong, nonatomic) IBOutlet UILabel* statusLabel;

在ViewController类中对应增加statusLabel数据成员。

ViewController.m中增加了2行:

--- a/first/ViewController.m
+++ b/first/ViewController.m
@@ -9,6 +9,7 @@
#import "ViewController.h"

@implementation ViewController
+@synthesize statusLabel;

- (void)didReceiveMemoryWarning
{
@@ -26,6 +27,7 @@

- (void)viewDidUnload
{
+ [self setStatusLabel:nil];
[super viewDidUnload];
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;

增加的@synthesize行表示自动增加对应数据成员的get和set成员函数。

viewDidUnload是结束程序时的操作,这里将label的内存空间释放。

添加button

添加button后,Storyboard中在subviews下增加了button元素。

                            </label>
+ <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment
+ <rect key="frame" x="26" y="13" width="72" height="37"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+ <fontDescription key="fontDescription" type="boldSystem" pointSize="15"/>
+ <state key="normal">
+ <color key="titleColor" red="0.19607843459999999" green="0.30980393290000002" blue="0.521568656000
+ <color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
+ </state>
+ <state key="highlighted">
+ <color key="titleColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
+ </state>
+ </button>
</subviews>

action关联

设置action关联后,ViewController类中添加了事件方法和具体实现。

Storyboard中,button元素下增加了connections元素。relationships节点下增加子节点relationship,kind为action。

                             <state key="highlighted">
<color key="titleColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
</state>
+ <connections>
+ <action selector="greeting:" destination="2" eventType="touchUpInside" id="Ua1-dU-BsV"/>
+ </connections>
</button>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
@@ -46,6 +49,7 @@
<class className="ViewController" superclassName="UIViewController">
<source key="sourceIdentifier" type="project" relativePath="./Classes/ViewController.h"/>
<relationships>
+ <relationship kind="action" name="greeting:"/>
<relationship kind="outlet" name="statusLabel" candidateClass="UILabel"/>
</relationships>
</class>

AppDelegate.h

#import <UIKit/UIKit.h>

@interface BIDAppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow* window;

@end

AppDelegate.m

方法:

  • application:didFinishLaunchingWithOptions

    这是一个多重参数函数

  • applicationWillResignActive

表格使用

  1. 拖入表格,选中并关联到下面的 View Controller,关联上dataSource和Delegate。
  2. ViewController.h中类要实现UITableViewDataSource和UITableViewDelegate。
@interface MasterViewController : UITableViewController <UITableViewDelegate, UITableViewDataSource>

@property (strong, nonatomic) NSArray* listData;
  1. ViewController.m中增加如下函数:
@synthesize listData;

- (NSInteger)tableView:(UITableView* )tableView numberOfRowsInSection:(NSInteger)section {
return [self.listData count];
}

- (UITableViewCell* )tableView:(UITableView* )tableView cellForRowAtIndexPath:(NSIndexPath* )indexPath {
static NSString* SimpleTableIdentifier = @"SimpleTableIndentifier";

UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:SimpleTableIdentifier];
if( cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:SimpleTableIdentifier];
}

NSUInteger row = [indexPath row];
cell.textLabel.text = [listData objectAtIndex:row];
return cell;
}

多视图控制

注意segue的使用,一定要聚焦到特定的控件上,比如button,而不是它的父控件,否则无效。

tagged by
comments powered by Disqus