iOS:即使将值传递给它,也不会设置全局属性变量

标签 ios objective-c global-variables

我有一组代码可以解析 XML 文件以查找用户 ID 号。这个 ID 号被发送到另一个 View Controller 以进行 SOAP WSDL 请求。问题是该值从未设置。

我的两个类是 LoginPageViewController 和 EMIMenuTableViewController。

我正在尝试将一个整数值从 LoginPageViewController 传递到 EMIMenuTableViewController。

这是 EMIMenuTableViewController 的头文件:

#import <UIKit/UIKit.h>
@interface EMIMenuTableViewController : UITableViewController
@property (nonatomic) int userNumber;
@end

这是 LoginPageViewController 的头文件:

#import <UIKit/UIKit.h>

@interface LoginPageViewController : UIViewController <NSXMLParserDelegate>

{
    NSXMLParser *xmlparser;

    NSString *classelement;
    NSMutableArray *titarry;
    NSMutableArray *linkarray;
    bool itemselected;
    NSMutableString *mutttitle;
    NSMutableString *mutstrlink;
    int userNumber;
    NSString *parsedString;
}

// Username and password text fields
@property (weak, nonatomic) IBOutlet UITextField *usernameTextField;
@property (weak, nonatomic) IBOutlet UITextField *passwordTextField;

// Logging in and registering
- (IBAction)loginButtonSelected:(id)sender;
@property (weak, nonatomic) IBOutlet UIButton *registerButton;

// Unwind segue IBAction for logging out
- (IBAction)logoutAndUnwind:(UIStoryboardSegue *)segue;

@end 

这是在 LoginPageViewController 中设置值的位置:

- (void)parserDidEndDocument:(nonnull NSXMLParser *)parser {
EMIMenuTableViewController *controller = [[EMIMenuTableViewController alloc] init];
// If the user is authenticated, allow them to proceed with the segue
if([parsedString containsString:@"User Authenticated"]) {

    >>>controller.userNumber = userNumber<<<; - set here
    NSLog(@"User:%d", userNumber);
    [self performSegueWithIdentifier:@"login_success" sender:self];
    NSLog(@"Logged In");

    // If the server says that the user isn't found, notify the user to create an account.
} else if([parsedString containsString:@"User Not Found"]) {

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"User Not Found" message:@"Please create an account!" delegate:self cancelButtonTitle:@"Close" otherButtonTitles:nil, nil];
    [alert show];

    // If the server replies that the password is incorrect, notify the user.
} else if([parsedString containsString:@"Password Incorrect"]) {

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Incorrect Username/Password" message:@"Plese try again." delegate:self cancelButtonTitle:@"close" otherButtonTitles:nil, nil];
    [alert show];

} else {

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"An error has occurred!" message:@"Please check your network connection and try again." delegate:self cancelButtonTitle:@"close" otherButtonTitles:nil, nil];
    [alert show];

}

}

这是显示未设置值的代码(在 EMIMenuTableViewController 中):

NSLog(@"User: %d", _userNumber);

此外,这是控制台输出。可以看到在我登录的LoginPageViewController中设置了值,但是在EMIMenuTableViewController中登录的时候是0。

2015-07-08 15:09:41.151 EMI[1971:173596] User:27808
2015-07-08 15:09:41.179 EMI[1971:173596] Logged In
2015-07-08 15:09:41.186 EMI[1971:173596] User: 0

我认为我这样做是对的,但我不知道哪里出了问题。我设置变量错误吗?

谢谢。

最佳答案

EMIMenuTableViewController *controller = [[EMIMenuTableViewController alloc] init]; 将创建一个新实例,在您的代码中您实际上没有使用它,这意味着您呈现了 EMIMenuTableViewController 的其他一些实例。

您需要获取所呈现的 EMIMenuTableViewController 实例的引用,然后仅在该实例上设置 userNumber

如果你使用 storyboard 和 segue 来呈现 EMIMenuTableViewController 过程如下

1)为上述segue提供一个segue标识符(这里是“segue_to_emimenutable”)

2) 声明一个名为“userNumber”的全局变量,并在 parserDidEndDocument 方法中更新 userNumber

3) 然后在 prepare segue 方法中将其传递给 EMIMenuTableViewController 的呈现实例

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if ([segue.identifier isEqualToString:@"segue_to_emimenutable"]) {
    EMIMenuTableViewController *destinationViewController = segue.destinationViewController;
    destinationViewController.userNumber = self.userNumber;
}

如果您要介绍带有 segue 的 Storyboard的任何其他方法,请在问题中提及它,以便我的答案可以针对该问题进行修改

关于iOS:即使将值传递给它,也不会设置全局属性变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31302949/

相关文章:

ios - 我没有 iPhone5,想在同一版本上测试功能以进行构建,我该怎么做?

iphone - 在启动图像上隐藏状态栏

c++ - 在测试中测试 C++ 全局变量的最佳方法

使用 Scripts.Render MVC4 时的 Javascript 全局变量

ios - UILocalizedIndexedCollat​​ion 只返回英文排序规则

ios - 为什么 Json 字典总是在 nsdata(Bytes) 中给出响应。我怎样才能从网络服务中获取字典

iOS-无法获取预期的 json 结果

ios - objective-c : Resizing a UIImageView

asp.net - 跨平台字符串加密

javascript - 函数退出后全局变量的值错误