2014-02-20 75 views
0

我是一個begginer,在最後一個問題中,我學習了一些關於MVC模式的知識。但我仍然有些疑惑。 我作爲初級工作,修改程序。在後面我會留下主要問題。如何使用MVC獲取變量

的最後一個問題是:

「我試圖分段控制變量發送到另一個文件,但我 不能得到它,我覺得我很安靜接近,但我需要一點點幫助,什麼是 錯?「

--<AdSettingsTVC.h>-- 

@interface AdSettingsTVC : UITableViewController 

@property (strong, nonatomic) NSString *serverName; 
@property (strong, nonatomic) IBOutlet UISegmentedControl *servidorControl; 

-(IBAction)getServer:(UISegmentedControl *)sender; 

@end 

--<AdSettingsTVC.m>-- 

@interface AdSettingsTVC() <UITextFieldDelegate, UIPickerViewDelegate, UIPickerViewDataSource> 
//General Settings 
@end 

@implementation AdSettingsTVC 

- (IBAction)getServer:(UISegmentedControl *)sender{ 
    ANLogDebug(@"%@ setServidor | Server changed to Settings: %ld", CLASS_NAME, (long)sender.selectedSegmentIndex); 
    if (sender.selectedSegmentIndex == 0){ 
     self.serverName = @"Server 1"; 
    } else if (sender.selectedSegmentIndex == 1){ 
     self.serverName = @"Server 2"; 
    } else if (sender.selectedSegmentIndex == 2){ 
     self.serverName = @"Server 3"; 
    } 
} 

--<AnAdFetcher.m>-- 

- (void)requestAdWithURL:(NSURL *)URL { 

    AdSettingsTVC *settings = [[AdSettingsTVC alloc] init]; 

     NSString *nameServer = settings.serverName --> it's null 
     self.URL = URL ? URL : [self adURLWithBaseURLString:[NSString stringWithFormat:@"http://%@", nameServer]]; 

} 

的這個問題的答案是,我沒有使用MVC模式,所以當我打電話AdSettingsTVC.alloc.init的值初始化爲零。然後我讀到我必須使用模型來聲明邏輯運算符。

現在,我意識到我有兩個模型文件,但是我不知道要在兩個文件中聲明什麼來獲取上面顯示的文件中的變量「serverName」。

我有什麼模型文件來聲明,我如何得到AnAdFetcher.m

變量

非常感謝您的寶貴時間

+0

據我可以告訴你的AdSettingsTVC沒有一個名爲'server'的屬性。所以我不知道爲什麼這不會給你一個錯誤,而不是編譯。 – Putz1103

+0

因爲您錯誤鍵入serverName作爲服務器?你在上面發佈的代碼中。你有沒有在AnAdFetcher.m中包含AdSettingsTVC.h? – Gruntcakes

+0

對不起,在代碼中是正確的。錯只是在這裏。 @MartinH是的,如果你的意思是#import,它包含 – user3325231

回答

1

當你第一次做

初始化的ViewController
AdSettingsTVC *settings = [[AdSettingsTVC alloc] init]; 

它內部的所有變量都設置爲nil或0(它們實際上也可能是垃圾值,但假設它們在當前形式中不可用)。所以如果在那之後你要求一個變量:

NSString *nameServer = settings.serverName; 

它會返回零。我猜,你認爲它應該根據返回:

if (sender.selectedSegmentIndex == 0){ 
    self.serverName = @"Server 1"; 
} else if (sender.selectedSegmentIndex == 1){ 
    self.serverName = @"Server 2"; 
} else if (sender.selectedSegmentIndex == 2){ 
    self.serverName = @"Server 3"; 
} 

,但你有沒有叫那個函數呢,你只初始化控制器。如果您希望serverName在控制器初始化之後立即生效,那麼您將不得不在控制器類中放置自定義初始化程序(或重載基本程序)。在該初始化程序中,您將不得不創建UISegmentedControl,然後根據其初始設置設置serverName。我不確定什麼時候使用故事板或xib初始化創建和使用所有可視對象,所以最好的選擇是在視圖控制器內創建一個函數(初始化後可以直接使用),如下所示:

-(NSString*)retrieveServerName: 
{ 
    [self getServer:mySegmentedControl]; 
    return self.serverName ? self.serverName : @"initial case when serverName is nil"; 
} 

作爲一個觀點,名爲getServer的方法確實是一種設置方法,而不是一種獲取方法。您可能會考慮將其重命名爲更符合該功能的東西。

+0

完美的解釋,非常感謝! – user3325231

+0

對不起,我不會說英語我有些事情讓我感到困惑。 因此,retrieveServerName應該在getServer的同一個文件中(包含if語句的文件)然後,在AnAdFetcher中初始化AdSettingsTVC之後,我必須調用retrieve函數而不是變量。我理解正確嗎? – user3325231

+0

在試圖獲取它之前,您只需要一些設置該變量的方法。但是,你這樣做會爲你工作。你需要先設置它。 – Putz1103