2012-06-07 93 views
0

在視圖中接受用戶輸入並將其轉移到該視圖的控制器的正確方法是什麼?我知道NotificationCenter是一種選擇,但肯定有更好的方法將數據從視圖傳輸到控制器?Objective C查看到控制器通信

所有幫助非常感謝,我始終接受一個答案!

回答

1

您正在尋找Delegation或者Data Source。你可以看到更多有關這個在這裏,Delegation and Data Sources

這方面的一個簡單的例子是,一些沿此線:

//MyViewSubclass.h 

    @protocol MyViewSubclassDelegate 
    //Implement your delegate methods here. 
    -(void)didTouchView; 
    @end 

    @interface MyViewSubclass { 

    id<MyViewSubclassDelegate>delegate; 
    } 
    @property(nonatomic,assign)id<MyViewSubclassDelegate>delegate; 

當然,@synthesizedelegateMyViewSubclass.m

現在該類的頭部,你想要MyViewSubclass的代表,你需要符合`MyViewSubclassDelegate協議。

#import "MyViewSubclass.h" 
@interface MyViewController : UIViewController <MyViewSubclassDelegate> 

在你@implementationMyViewController.,實施-(void)didTouchViewMyViewSubclassDelegate方法。

當初始化並創建MyViewSubclass對象,設置MyViewController爲代表:

myViewSubclass.delegate = self // Self being MyViewController. 

在你MyViewSubclass,當你準備好任何信息轉發,或者只是想火的方法你會做[self.delegate didTouchView]

希望這會有所幫助!

+0

是的,這似乎是我正在尋找。使用@protocol而不是僅引用self.delegate有什麼好處? – danielmhanover

+0

太棒了!很高興我能提供幫助,如果這足以作爲你問題的解決方案,請檢查它,因爲:) – skram

+0

使用@protocol代替引用委託的好處可以更好地控制委託行爲。我,電子郵件:在協議中添加@required告訴您的委託,該方法是必需的,並給你一個警告,它不存在。其中包括諸如'-conformsToProtocol:'來檢查一個類IS是否確實是你的對象的一個​​委託。 – skram

2

使用委託協議設計模式或通過子類UIControl的目標操作。考慮一下UIButton如何告訴視圖控制器它已被按下。在界面構建器中,您將一個動作 - 一個類似於touchUpInside:的選擇器連接到目標 - 擁有它的視圖控制器。在非IB中,您直接告訴UIButton選擇器和使用什麼目標。

這兩種方法在不同情況下都有意義。例如,對於UITextField,使用委派更有意義,因爲文本字段可能會向您發送任意數量的事件,例如用戶開始編輯時的事件,結束編輯或鍵入字符。

對於一個按鈕,使用target-action更有意義,因爲實際上只有一個事件以不同形式表達。

對於滑動和拖動以及其他手勢,請使用UIGestureRecognizer s。

+0

問題是,我想以觸摸和拖動的形式接受用戶輸入,而不是按鈕。我怎麼做? – danielmhanover

+0

我只是用'UIButton'作爲例子。你可能想把'UIGestureRecognizer'添加到你的視圖中。 –

1

您正在尋找delegation,其中控制器將自己設置爲視圖的代表。你從UITableViewDelegate知道它。

0

使您的視圖成爲UIControl的子類並實現目標/動作設計模式 - 使用sendActionsForControlEvents:方法向控制器發送消息。

0

通常UIKit對象(如UITextField)具有您可以實現以執行業務邏輯的委託方法。 E.g UITextField有一個名爲- textFieldDidEndEditing:的委託方法,在用戶解散鍵盤後被調用。