2012-07-13 24 views
1

當我創造了我的故事情節進行UISwitch元素,並將其連接到.h文件中,有一個在控制器產生這一行:我應該使用IBAction來處理屏幕上可能發生的一切嗎?

@property (weak, nonatomic) IBOutlet UISwitch *wantHelp; 

而我試圖找出如何使系統公告當值被改變,所以我想這樣的手動添加下面的東西原來的語句:

- (IBAction)wantHelp:(id)helpToggle; 

,並在控制器中,我有這樣的事情:

-(IBAction)helpToggle:(id)sender 
{ 
    NSLog(@"sender is: %@", sender); 

    if (wantHelp.on) 
    { 
     NSLog(@"yes"); 
    } 
    else 
    { 
     NSLog(@"No"); 
    } 
} 

我想要做的是將helpToggle IBAction與特定的UISwitch元素連接起來,但是當我運行它時,出現一個錯誤:unrecognized selector sent to instance,據我瞭解這意味着我調用了一個不正確的對象的操作。

有人能幫我理解我在這裏做錯了嗎?

謝謝!

這是我的.m文件看起來像:

@interface PlanBusinessController() 

@end 

@implementation PlanBusinessController 
@synthesize businessDescription; 
@synthesize personName; 
@synthesize personEmail; 
@synthesize privacy; 
@synthesize wantHelp; 


-(IBAction)helpToggle:(id)sender 
{ 
    NSLog(@"sender is: %@", sender); 

    if (wantHelp.on) 
    { 
     NSLog(@"yes"); 
    } 
    else 
    { 
     NSLog(@"No"); 
    } 
} 
+0

你有它向後「,這是我理解的是意味着我叫一個不正確的對象上的操作。「你調用了一個對象不理解的操作(方法/選擇器),對象不理解(也沒有聲明) – 2012-07-13 19:23:29

回答

2

所以你可以有任意多的IBAction你想要的或者它沒有關係。最重要的是在.h文件中聲明它,進入界面構建器並將所需的操作鏈接到IBAction。 所以你有你的IBAction

-(IBAction)WHATEVERNAME:(id)sender 

然後到界面生成器,然後單擊您的文件的所有者對象(有點左上)上。然後在連接督察(右上) 並拖動從點單擊它說:WHATEVERNAME給你的對象(UISwitch wantHelp) 當你這樣做,它會問你要接收

取心中的原因是什麼動作爲(id)sender是,你想投你的對象

UISwitch * tempSwitch = (UISwitch*) sender; 

,讓你有一個指向對象開關這 是因爲你可以有這種相同的IBAction爲方法處理多種不同類型的對象


雖然這是所有好東西,實際的錯誤來自多個選擇器被調用。一旦我們進入連接檢查員,我們就可以看到它所調用的兩種不同的方法。一個是有效的IBAction,另一個是以前聲明的方法wantHelp

+0

謝謝,就這樣我明白,是行 - (IBAction)WHATEVERNAME:(id)發送者應該在我的.h文件?它反對在最後有一個分號,對嗎? – GeekedOut 2012-07-13 19:33:54

+0

是的,但是它應該在.h中與.h在一起;在.m與{}在它之後(no;) – 2012-07-13 19:35:51

+0

I只是試圖添加該行(與我自己的變量名)的.h文件,然後連接到該聲明的uiswitch,運行該程序和相同的錯誤關於無法識別的選擇器。 – GeekedOut 2012-07-13 19:36:14

3

發生了什麼事是你UISwitch已被告知不過來調用wantHelp:因爲沒有把這種存在於你實現文件(.m文件)方法這就是爲什麼'無法識別的選擇器發送到實例'錯誤被稱爲。

1

IBAction僅僅是讓Interface Builder知道它可以附加到該動作的標籤。

IBAction被定義爲void,但名稱Interface Builder允許您通過它拖動連接並將對象中的事件連接到該函數。

除此之外,你的行爲應該有一個有意義的名字。 helpToggle對我來說似乎是一個關閉開關。但通常我會在該消息中包含一些描述。如

- (IBAction) helpSwitchToggled:(id) sender{ 
} 

這個消息給你一個非常有意義的名字,讀它會告訴你什麼exactally呼籲它,以及消息的那個對象正在發送的類型。

在結合我也有一個IBOutlet該交換機稱爲helpSwitch,贊一個。

@property (nonatomic, weak) IBOutlet UISwitch *helpSwitch; 

正如你所看到的。該對象顯然是一個開關。而IBOutlet實際上被定義爲什麼都沒有。但是它又是一個Interface Builder用來知道你有一個可以與Interface Builder鏈接的屬性的標籤。

IBAction爲IBOutlet中和不外乎元數據,告訴Interface Builder的,這是一個可能的連接更多。連接它們取決於你,編譯器將它們視爲無關緊要。

我希望這些信息幫助你:)

2

好了,所有的答案未能給您「最簡單的方式」

按住控制你的UISwitch並將其拖動到你的.h文件。

然後您將看到一個對話框,將允許您選擇「連接」

enter image description here

此連接確定是否要創建和IBOutlet中或IBAction爲。

一旦更改爲「行動」然後你會讓它自動選擇「的ValueChanged」的事件,你可以給它任何你想要的名稱:

enter image description here

我把它命名爲helpSwitchToggled。然後你將在.h和.m文件中擁有你的IBAction。

enter image description here

在你.m文件,那麼你可以寫你的價值的代碼改變行動:

enter image description here

進行復制粘貼:

- (IBAction)helpSwitchToggled:(id)sender { 

    if(self.helpSwitch.on) 
    { 
     //Do the On stuff 
    } else { 
     //Do the Off Stuff 
    } 

} 

那就是「容易方式「來做出與你的界面上的某些東西相關的動作。

IBAction爲IBOutlet中和之間的差已經指出在其他的答案,但基本上動作是響應控制事件和出口到視圖內的元件的連接。

+0

糟糕,我稱IBOutlet「helpSwitch」而不是「wantHelp」,因此您需要將if(self.helpSwitch.on)更改爲if(self.wantHelp.on) – 2012-07-13 19:56:05

相關問題