1. 程式人生 > >IOS學習四:基礎控制元件Label,textfield,button等使用

IOS學習四:基礎控制元件Label,textfield,button等使用

本來應該早寫這個學習筆記的。

但是寫blog真是件痛苦得事。

今天剛面試了一個來IOS開發的同學。我覺得我得加緊進度啦。

學習進度:本例子是學習4天后紅柚子第一個完整例子程式碼,基本把oc基礎看完後實踐的,

其實發現這個例子完完全全是為熟悉IB外掛拖來拉去佈局而來的。

這邊申明兩個方面,也是面試3個同學後給的提議,也是論壇上很多給的提議:

1.不建議使用IB檔案來佈局,介面檔案還是需要程式碼寫,後期維護起來簡單。並且在拖來拖去時遺漏一個輸出口就很悲劇。

而且大牛們都建議純程式碼寫,這點我也考慮到如何保持介面得美觀,因為程式碼得話我沒法實時檢視佈局效果,這個絕對是ANdroid開發

時一個很大額問題,不過ios上基本沒事,因為ios螢幕得統一性,一般情況下美工繪製完介面後會把每個控制元件得座標都給你。

當然,喜歡xib檔案得也可以,甚至storyboarder。只是說,要有程式碼熟練書寫控制元件得能力。

2.ARC機制,問了下最近部分培訓出來的,基本是iso5.0+xcode4.2,其實這些新特性都引入了。

本來應該是個好事,但是,有個同學說,他們老師暫時不建議直接用ARC機制,首先,這樣會漸漸喪失記憶體管理的概念(當然u作為一個從java過來的人,談不上喪失

因為本來就沒有),其次是在ios開發中會大量引入第三方庫,那些庫在沒有支援ARC機制下,那麼整個專案可能就會出現問題。因此在開發中要自己考慮周到,

當然,我是希望這個機制最終能被我開發者完全接受,畢竟省力是一件討好的事。

正題:

我們先用xcode建立一個最簡單得例子

1.開啟xcode引導新建一個Project,我這邊選這個模板


然後填寫一些專案的基本命名和屬性


第一個專案名,第二項類似於android中得包名,貌似是app唯一標識。

第四項,類字首,預設是沒有,寫上後模板生成得幾個類前預設帶個這個字首。

說下最後三個複選框。

第一個就是我們說的新特性之一,用storyboards管理佈局檔案。

第二個arc機制

第三個自動生成一個測試用例。

這次我全不選,不過我學的時候選了ARC,完全不用釋放記憶體。這回是聽了那幾個朋友的建議,初學者要給自己較好的編碼意識。

2.建立完後我們來大致看下目錄結構分析,然後應用是如何啟動的


一般我們在看一個整體應用時,我們都會去了解這個應用到底是怎麼起來的(Android比如簡單的就是一個入口activity。當然在往前點可能說是Applicaton)

ios中,則是在使用者點選應用後,會進入這個main函式。然後我們看了下這個函式唯一能讓我們關聯得就是NonoAppDelegate這個類

(我這邊比較俗,既看一個應用啟動流程時,我保證程式碼能把我整個應用竄起來,不考慮後臺到底怎麼怎麼程序,loop啊,佇列什麼的,目前對我們來說太深奧了)。

好了,這個main之後能跳到我們的代理類了。

我們看下代理類中內容

//
//  NonoAppDelegate.h
//  TestOne
//  Created by Nono on 12-4-25.
//  Copyright (c) 2012年 NonoWithLilith. All rights reserved.
//

#import <UIKit/UIKit.h>

@class NonoViewController;

@interface NonoAppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;
@property (strong, nonatomic) NonoViewController *viewController;
@end
以上這是標頭檔案。
@synthesize window = _window;
@synthesize viewController = _viewController;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
    // Override point for customization after application launch.
    self.viewController = [[[NonoViewController alloc] initWithNibName:@"NonoViewController" bundle:nil] autorelease];
    self.window.rootViewController = self.viewController;
    [self.window makeKeyAndVisible];
    return YES;
}

實現檔案我們就看部分。

該實現方法是應用啟動完後,載入一個視窗,然後在視窗上新增各種View。

這邊說個小注意點。

在main函式時,我們會看到兩種書寫:

第一種:

int main(int argc, char *argv[])
{
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, nil);
    }
}

第二種:
int main(int argc, char *argv[])
{
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([NonoAppDelegate class]));
    }
}

我們可以看到UIApplicationMain方法引數不一樣。

對於這個,這哥們得博文寫的比較明瞭了:《Main方法得討論》

3.

以上基本一個帶視窗單空白檢視的得應用就起來了。現在,我們集合IB控制元件往該檢視上新增一些常用的基礎控制元件

首先我們在NonoViewController.h定義一些屬性控制元件申明輸出口,以及按鈕IBAction連線入口

#import <UIKit/UIKit.h>

#define kSwitchIndex 0
@interface NonoViewController : UIViewController<UIActionSheetDelegate>
{
    UITextField *userNameText ;
    UITextField *passWordText ;
    UILabel *sliderLabel;
    UISlider *slider;
    UISwitch *switchButton;
    UIButton *button;
}

@property (nonatomic , retain) IBOutlet UITextField *userNameText;
@property (nonatomic , retain) IBOutlet UITextField *passWordText;
@property (nonatomic , retain) IBOutlet UILabel *sliderLabel;
@property (nonatomic , retain) IBOutlet UISwitch *switchButton;
@property (nonatomic , retain) IBOutlet UIButton *button;

-(IBAction)textFieldDoneExting:(id)sender;
-(IBAction)backgroundTap:(id)sender;
-(IBAction)sliderChanged:(id)sender;
-(IBAction)segementButton:(id)sender;
-(IBAction)switchchanged:(id)sender;
-(IBAction)buttonOnclick:(id)sender;
@end

然後我們來看對應 xib檔案


然後我們來看怎拖拉來與程式碼中的輸出口連線起來。

這邊我們先看下xib檔案得一些顯示:

首先是這個filesOwner,檔案擁有者,其實就是下面這些控制元件物件的擁有者,而我們知道,

擁有這些物件的就是我們的NonoViewController


接下來我們看連結操作:



(擦,截這個圖我得xcode死掉了好幾次 = =。)

很很簡單,我們知道filesowner其實就是我們得NonoViewController類,裡面有我們申明得幾個輸出口,要很xib檔案建立連結

其實就是我們在該類中定義一個物件,我們需要指向一個例項,該例項就是xib檔案中我們拖進去得控制元件。

好,現在我們點選filesower,然後按住control鍵,移動滑鼠箭頭就會出現一個藍色的線,隨便連結到下面的一個控制元件鬆開滑鼠,

會自動提示你,NonoViewController中得哪幾個指標(輸出口)可以指向這個控制元件。這樣就把程式碼和xib檔案的物件一一聯絡起來了。

我們可以看最右邊的屬性圖,可以看出有個Outlets標籤,裡面刊例瀏覽當前控制元件的連結情況。

同時還有個reference outlets,其實剛和和上面相反,這個看字面意思就是引用得輸出口

此刻我們以一個輸入使用者名稱得textField舉例,我們知道filesOwner中(也就是NonoViewController)有使用者名稱的輸出口,指向了xib中的輸入使用者名稱。


那麼對應得 我們選中userNameText這個控制元件後,他的reference outlet是在filesowner中


當你把這個關係理清楚後,那麼佈局與程式碼的連結就很簡單了。

同樣得,我們能看到如果是按鈕型別的,會有個event動作得輸出口,設計理念基本上理解上面這種後,這個是很容易明白的。

然後對於每個textfield,button什麼的細節設定,都可以在右邊得屬性欄中修改。

5.以後我們基本就申明完一個控制類了,然後是實現類了。

不好意思,本來說重寫下不用ARC機制的,當這會都11點了,沒心情重寫下,copy早幾天寫的那個講究看下了

//
//  NonoViewController.m
//  ApressFirst
//
//  Created by Nono on 12-4-17.
//  Copyright (c) 2012年 NonoWithLilith. All rights reserved.
//

#import "NonoViewController.h"

@implementation NonoViewController
@synthesize userNameText;
@synthesize passWordText;//該定義會自動實現setter和getter方法
@synthesize sliderLabel;
@synthesize switchButton;
@synthesize button;
//定義得按鈕事件1
-(IBAction)switchchanged:(id)sender
{
    UIActionSheet *sheet = [[UIActionSheet alloc] initWithTitle:@"U will die!" delegate:self cancelButtonTitle:@"OK" destructiveButtonTitle:@"i know"  
        otherButtonTitles: nil];
    [sheet showInView:self.view];

}
//定義的按鈕事件2
-(IBAction)buttonOnclick:(id)sender
{
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"警告提示!" message:@"你點選了按鈕!" delegate:self cancelButtonTitle:@"確定"
        otherButtonTitles:@"測試下", nil];
    [alert show];
}

-(IBAction)segementButton:(id)sender
{   
    if([sender selectedSegmentIndex] == kSwitchIndex)
    {
        switchButton.hidden = NO;
        button.hidden = YES;
    
    }else {
        switchButton.hidden = YES;
        button.hidden = NO;
    }

}

-(IBAction)sliderChanged:(id)sender
{
    UISlider *uiSlider = (UISlider*)sender;
    int size = (int)uiSlider.value;
    NSString *sizeText = [[NSString alloc] initWithFormat:@"%d",size];
    sliderLabel.text = sizeText;
   // [sizeText release];
}

-(IBAction)textFieldDoneExting:(id)sender
{
    [sender resignFirstResponder];//放棄當前焦點
    //隱藏鍵盤
}

-(void)actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex
{
    NSLog(@"我靠!!!");
}
-(IBAction)backgroundTap:(id)sender
{
    [userNameText resignFirstResponder];
    [passWordText resignFirstResponder];
    //點選背景後隱藏鍵盤
}

- (void)viewDidLoad
{
    [super viewDidLoad];
//    NSString *sizeValues = [[NSString alloc] initWithFormat:@"%d",slider.t]
//    sliderLabel.text = 
        // Do any additional setup after loading the view, typically from a nib.
}

//- (void)dealloc
//{
////    [userNameText release];//如果引入得arc機制後該方法無需呼叫。
////    [passWordText release];
//    [super dealloc];
//}
- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}

@end

以上實現基本沒什麼太多內容。

方法中會有呼叫幾個對話方塊控制元件

UIAlertView基本就是這麼一個樣子:


一般來說alert就是一個警告對話方塊,只要一個確認按鍵點選後對話方塊消失就好了,但是又時我們又會希望點選確認或是如上面我自己新增得測試下這個按鈕

我們希望又相應得處理,那麼就可以引入UIActionSheetDelegatede 委託,

同樣樣還用到一個UIActionSheet


同樣是擁有相應得委託協議。

這些其實都是很具有通行的,一開始可能比較亂,看過2-3個後就覺得,原來如此。

然後我們看下這個方法:

-(IBAction)textFieldDoneExting:(id)sender

{

    [sender resignFirstResponder];//放棄當前焦點

    //隱藏鍵盤

}

ios中得輸入不同於Android,他得顯示和顯示一般要手動去去做,這個方法我們是連結了我們定義的控制元件event方法。


上面這個方法在點選done時出發,類似與告訴程式,輸入完了,取消鍵盤。

但是當我們對輸入格式什麼得做了默寫限制時,比如,該輸入框只能輸入數字。


那貌似沒有這個done操作了。

還好,一般ios預設或是長期得使用者習慣取消鍵盤顯示得操作就是點選鍵盤區域外得任意點取消鍵盤顯示。

那麼外面的區域其實是對應得xib中得view這個物件,此時我們需要將他強轉化成UIController型別,因為只有此型別才會在屬性中顯示event連結選項。

然後我們給他設定一個touchdown事件出發相應得方法:

-(IBAction)backgroundTap:(id)sender

{

    [userNameText resignFirstResponder];

    [passWordText resignFirstResponder];

    //點選背景後隱藏鍵盤

}

好了。睡覺。以上主要是怎麼用ib來實現佈局。很基礎也很簡單到此

(昨兒停電斷網了,csdn部落格怎麼沒有實時儲存功能麼,今天一看發現就前半部分了。暈哦)