詳解iOS應用使用Storyboard布局時的IBOutlet與IBAction_IOS

來源:互聯網
上載者:User

在圖形介面編程時,解決的第一問題就是如何將靜態介面與代碼關聯起來,或者說是代碼如何與介面上的對象

通訊, 代碼如何操作介面上的對象。在iPhone平台上,引入了IBOutlet與IBAction。通過在變數前增加IBOutlet

來說明該變數將與介面上的某個UI對象對應,在方法前增加IBAction來說明該方法將與介面上的事件對應. 

下面通過一個串連網路伺服器(NetworkConnection)的例子來說明IBOutlet與IBAction。

介面上有host 與 port 的Text Field UI對象,一個Button對象。

所以代碼中需要定義兩個IBOutlet變數,分別用來定義host與port; 一個IBAction方法,用來發起串連動作。

在NetworkConnectionViewController.h檔案中:

定義變數:

複製代碼 代碼如下:

@interface NetworkConnectionViewController : UIViewController {
    UITextField *host;
    UITextField *port;
}

將這兩個變數說明為IBOutlet變數:
複製代碼 代碼如下:

@property(nonatomic, retain) IBOutlet UITextField *host;
@property(nonatomic, retain) IBOutlet UITextField *port;

 

在NetworkConnectionViewController.m檔案中增加:

複製代碼 代碼如下:

@synthesize host;
@synthesize port;

開啟NetworkConnectionViewController.xib檔案,拖兩個Text Field對象到上面。

按住Ctrl鍵,拖拽File's Owner到Text Field之上,會彈出Outlets挑選清單,在列表中可以看到host與port。

分別為兩個Text Field選擇Outlet變數。這樣做了以後,介面上的Text Field對象就與程式中定義的變數就關聯起來,

當改變變數的屬性時,就會顯現在介面上。

為了檢驗變數是否與介面對象關聯,在viewDidLoad方法中給變數付值然後編譯運行。

複製代碼 代碼如下:

- (void)viewDidLoad
{
    [super viewDidLoad];
    host.text = @"192.168.1.100";
    port.text = @"8080";
}

運行後,可以在介面的Text Field中看到這些值,說明變數與介面對象關聯正確。從而就可以在介面中看到變數的值。

 

在NetworkConnectionViewController.h檔案中增加一個IBAction方法:

複製代碼 代碼如下:

-(IBAction)connectNetwork;
在NetworkConnectionViewController.m檔案中實現該方法:

-(IBAction)connectNetwork

   UIAlertView *alter = [[UIAlertView alloc] initWithTitle: @"Connection Network" message: @"sending command to the server" delegate: self cancelButtonTitle: @"OK" otherButtonTitles: nil];
   
    [alter show];
    [alter release];
//connect network
//............


開啟NetworkConnectionViewController.xib,拖一個Round Rect Button到上面。
然後按住Ctrl鍵,拖拽該button到File's Owner上,在彈出的IBAction列表中

選擇connectNetwork。這樣當該button被按下彈起後就會調用connectNetwork方法。

IBOutlet與IBAction是iPhone應用開發的基礎,是成功邁向iPhone平台應用開發的第一步。

為什麼IBOutlet屬性是weak的?

因為當我們將控制項拖到Storyboard上,相當於新建立了一個對象,而這個對象是加到視圖控制器的view上,view有一個subViews屬性,這個屬性是一個數組,裡面是這個view的所有子view,而我們加的控制項就位於這個數組中,那麼說明,實際上我們的控制項對象是屬於view的,也就是說view對加到它上面的控制項是強引用。當我們使用Outlet屬性的時候,我們是在viewController裡面使用,而這個Outlet屬性是有view來進行強引用的,我們在viewController裡面僅僅是對其使用,並沒有必要擁有它,所以是weak的。

如果將weak改為strong,也是沒有問題的,並不會造成強引用迴圈。當viewController的指標指向其他對象或者為nil,這個viewController銷毀,那麼對控制項就少了一個強引用指標。然後它的view也隨之銷毀,那麼subViews也不存在了,那麼控制項就又少了一個強引用指標,如果沒有其他強引用,那麼這個控制項也會隨之銷毀。

不過,既然沒有必將Outlet屬性設定為strong,那麼用weak就好了: ]

一個控制項可以在viewController裡面有多個Outlet屬性,就相當於一個對象,可以有多個指標指向它(多個引用)。

但是一個Outlet屬性只能對應一個控制項,也就是說,如果有button1和button2,button1在viewController裡面有一個名為button的Outlet屬性,此時button指向button1,但是如果用button2給button重新賦值,那麼此時button指向button2。也就是說,後來的覆蓋原來的。

一個控制項可以在viewController裡面觸發多個IBAction。比如有一個button控制項,在viewController裡面有幾個方法,那麼點擊button,會觸發所有的這些方法。

如果我有多個控制項,比如button1,button2,button3,它們也可以同時綁定一個buttonClick方法,無論點擊button1,button2還是button3,都會觸發這個buttonClick方法。

上面說了,button1,button2,button3有可能都觸發buttonClick方法,如果想在buttonClick方法裡面區分到底是哪個button觸發的可能有好幾種做法。

可以給這三個button各設定一個Outlet屬性,然後在buttonClick裡面判斷sender和哪個Outlet屬性是同一對象,這樣就可以區分了。但是很明顯,這樣並不合理,因為建立的三個屬性有些浪費。
我們可以給三個button各加一個tag,在buttonClick裡面通過switch(或者if...)判斷,sender的tag和給各個button加上的tag是否一致,如果一致則為同一對象。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.