【问题标题】:How to use MVC to get variables如何使用MVC获取变量
【发布时间】:2014-03-21 17:06:25
【问题描述】:

我是一个初学者,在我的最后一个问题中,我了解了一点 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 时,值被初始化为 nil。然后我读到我必须使用模型来声明逻辑运算符。

现在,我意识到我有两个模型文件,和

我必须在模型文件中声明什么以及如何从 AnAdFetcher.m 中获取变量

非常感谢您的宝贵时间

【问题讨论】:

  • 据我所知,您的 AdSettingsTVC 没有名为 server 的属性。所以我不确定为什么这不会给你一个错误并且根本没有编译。
  • 因为您将 serverName 错误地输入为 server?您在上面发布的代码中有。你有在 AnAdFetcher.m 中#included AdSettingsTVC.h 吗?
  • 对不起,在代码中是对的。错字只在这里。 @MartinH 是的,如果你的意思是#import,它包含在里面

标签: ios variables model-view-controller model


【解决方案1】:

当你第一次初始化你的视图控制器时

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 的方法实际上是设置方法,而不是获取方法。您可能会考虑将其重命名为更符合函数功能的名称。

【讨论】:

  • 对不起,我不会说英语,有些事情让我感到困惑。所以retrieveServerName应该在getServer的同一个文件中(带有if语句的那个​​)然后,在AnAdFetcher中初始化AdSettingsTVC之后,我必须调用retrieve函数而不是变量。我理解正确吗?
  • 您只需要在尝试获取该变量之前通过某种方式设置该变量。但是,您这样做对您有用。您需要先以某种方式设置它。
  • 我在调用方法 [settings retrieveServerName] 时遇到问题;我知道那不是正确的方法..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多