2013-03-09 62 views
0

我試圖使用委託從一個VC傳遞值到另一個。我認爲我誤解了它應該工作的方式。Objective-C iOS 6委託NSString查詢

在我的主要ViewController.h我有這樣的:

@protocol defaultLocationChoice <NSObject> 

- (NSString *) locChoice; 

@end 

在我PreferencesViewController.h和ChooseServerViewController.h我都必須在@interface部分聲明defaultLocationChoice和財產assinged像這樣:

@property (nonatomic, assign) id <defaultLocationChoice> locationDelegate; 

兩者都是合成的。

當用戶從PreferencesViewController塞格斯到ChooseServerViewController爲賽格瑞代碼的準備是:

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 

    if ([segue.identifier isEqualToString:@"toServerChoice"]) { 
     ChooseServerViewController *viewController = (ChooseServerViewController *)segue.destinationViewController; 
     viewController.locationDelegate = self; 

    } 

} 

當一個細胞的選擇在ChooseServerViewController由我打電話:

[self locChoice]; 

那就是:

- (NSString *) locChoice { 
    NSLog(@"Cell Vale Loc choice %@",cellValue); 
    return cellValue; 
} 

NSLog驗證返回了正確的值。

現在,我想我明白了,LocChoice在委託中的價值現在是返回的值,不是嗎?

當用戶回到(NavController)的PreferencesViewController有:

-(void) viewWillAppear:(BOOL)animated { 

    [super viewWillAppear:animated]; 
    defaultLocation = [locationDelegate locChoice]; 
    [self.tableView reloadData]; 
} 

我期待defaultLocation的價值現在等於傳遞給locChoice值。但是,當表格重新加載相關單元格時仍然是空白的,暗示我所發生的事情不會發生。

任何想法?

+0

你有沒有登錄defaultLocation? – Shashank 2013-03-09 03:25:19

回答

2

如果我正確地關注了您的代碼,則不需要在您的ChooseServerViewController中只採用上述協議,只需要PreferencesViewController

推理是你想發送數據到以前的視圖控制器。嘗試:

@protocol defaultLocationChoice <NSObject> 
    - (void) locChoice:(NSString*)choice; 
@end 

讓你的PreferencesViewController實現該方法,因此接收選擇。您必須將其存儲在適當的實例變量中。

// in PreferencesViewController.m 
-(void)locChoice:(NSString*)choice { 
    self.choice = choice; // this just my example 
} 

當做出選擇(在ChooseServerViewController)來選擇送回,請致電:

// this is in 'ChooseServerViewController.m' some where appropriate 
[self.delegate locChoice:cellValue]; 

你的實現是簡單地做什麼用的單元格值(甚至不存儲,只是記錄它) 。當您返回到PreferencesViewController時,您現在將擁有選定的值,並且該視圖控制器可以根據需要使用它。

協議有點像Java或C#中的接口,但更靈活。

UPDATE

ChooseServerViewController聲明應該是這樣的:

#import "FileWithProtocolDecalration.h" 
@interface ChooseServerViewController 
. 
. 
. 
@property (nonatomic,assign) id<defaultLocationChoice> delegate; 
. 
. 
. 
@end 
+0

我的ChooseServerViewController抱怨說我沒有實現所需的協議? – 2013-03-09 03:54:34

+0

@DanJamesPalmer該視圖控制器不需要實現它,因此在.h中刪除'部分。我會更新我的答案。 – 2013-03-09 03:56:59

+0

我嘗試過,但它然後抱怨我的PrepareForSegue代碼,因爲它無法找到ChooseServerViewController中的locationDelegate和self.delegate拋出和錯誤,它無法找到「委託」 – 2013-03-09 03:58:48

0

我想你確實有一些誤解

協議和委託是傳遞的東西。換句話說,有人需要成爲接收者,有人需要成爲發件人。在你的情況。
更新協議此

@protocol defaultLocationChoice <NSObject> 

- (void)locChoice:(NSString *)updateString; // the method from delegate and implementer must be exact 

@end 

和VCReceiver設置實現協議的ViewController作爲接收機

@interface VCReceiver : UIViewController <defaultLocationChoice> 

再後來

- (void)viewDidLoad { 
    ChooseServerViewController *vcSender = [[ChooseServerViewController alloc] init]; 
    [vcSender setLocationDelegate:self]; // this is like saying. i have implemented method from protocol in this file (self) 
} 
- (void)locChoice:(NSString *)updateString { 
    // update the VCReceiver here 
    // or access vcSender value 
    // or use the updateString value 
} 

然後在ChooseServerViewController locChoice:方法(從一個你的例子)用這個替換並且改爲[self updateChoice]

- (void)updateChoice { 
    if ([self.locationDelegate respondsToSelector:@selector(locChoice:)]) { 
     [self.locationDelegate locChoice:aStringToUpdate]; // this will call VCReceiver locChoice 
    } 

它不必返回任何內容,因爲它實際上調用VCReceiver方法告訴它ChooseServerViewController已準備好讀取值。