2015-12-30 71 views
-3

我一直在研究代表。爲什麼不委派工作?

所以我寫代碼,然後運行此代碼。

你能告訴我有什麼問題嗎?

這是我的代碼。

ViewController2.h

@protocol ViewController2Delegate <NSObject>; 
@required 
-(void)practiceDelegateMethod:(Float32)var1 andVar2:(Float32)var2; 
@end 
@interface ViewController2 : UIViewController 
@property (assign, nonatomic) id <CompressSetupViewControllerDelegate> delegate; 

ViewController2.m

@synthesize delegate; 

- (IBAction)compressSetupCancleAction:(id)sender { 
    [self.delegate practiceDelegateMethod:var1 andVar2:var2]; 
    [self dismissViewControllerAnimated:YES completion:nil]; 
    } 

ViewController1.h

@interface HomeViewController : UIViewController<ViewController2Delegate> 

ViewController1.m

-(void) practiceDelegateMethod:(Float32)var1 andVar2:(Float32)var2{ 
    NSLog(@"delegate var1 : %@ var2 : %@",[NSString stringWithFormat:@"%f",var1],[NSString stringWithFormat:@"%f",var2]); 
} 
+1

上ViewController1,你有沒有設置ViewController2。委託=自我; ? –

+0

@CongTran是的,設置viewDidLoad。 –

+0

@CongTran ViewController2Delegate * vc2 = [[ViewController2Delegate alloc] init]; vc2.delegate = self; –

回答

-1

還有另一個方式來傳遞viewcontrollers之間數據NSNotification

從類發送消息,發佈通知,如:

[[NSNotificationCenter defaultCenter] postNotificationName: @"YOUR_NOTIFICATION_NAME" object: anyobjectyouwanttosendalong(can be nil)]; 

在您希望收到通知的視圖控制器發佈時間:

在viewDidLoad中做到:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(METHOD_YOU_WANT_TO_INVOKE_ON_NOTIFICATION_RECEIVED) name:@"YOUR_NOTIFICATION_NAME" object:sameasbefore/nil]; 

重要!不要忘記這一點在你的viewDidUnload():

[[NSNotificationCenter defaultCenter] removeObserver:self name:@"YOUR_NOTIFICATION_NAME" object:sameasbefore/nil]; 

注: - 當它是唯一一個通知另外一個對象,你最好使用協議:)但是,在這種情況下,由於有多個視圖控制器聽力,使用通知

如果你想要去的協議,然後參照上面的鏈接

Click Here

+0

感謝您的幫助。我解決了問題使用通知。 –

+0

雖然這個鏈接可能回答這個問題,但最好在這裏包含答案的重要部分,並提供供參考的鏈接。如果鏈接頁面更改,則僅鏈接答案可能會失效。 - [來自評論](/評論/低質量帖/ 10725738) –

+0

@JisooKwon我編輯我的答案,如果它的權利,然後給它正確的標記,所以它的幫助其他:) –

-1

在你HomeViewController當你永遠使ViewController2分配代表自我

ViewController2 *controller = [[ViewController2 alloc]init]; 
    controller.delegate = self 
+0

用戶不得不創建一個新的引用...他們可以從其他地方獲得它... – LearneriOS

+0

是的,這是沒有必要創建一個新的參考,但這只是爲了理解目的 –

+0

this代碼存在HomeViewController viewDidLoad。原始代碼是 –

-1

情況下,我認爲問題是,你沒有得到的viewController2在viewController1的參考,由於一些問題。 得到viewcontroller1的viewController2的非空引用,然後

<ref of ViewController 2>.delegate = self

我認爲你必須在viewcontroller1作爲零的viewController 2的參考。與更換

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

-1

嘗試:

@property (assign, nonatomic) id <ViewController2Delegate> delegate; 
+0

,CompressSetupViewControllerDelegate。 –

+0

你有沒有設置classObj.delegate = self;在創建類的對象後在ViewController1中? –

+0

在ViewController1中是yes viewDidLoad –