【问题标题】:How to access property in different view controller?如何访问不同视图控制器中的属性?
【发布时间】:2015-01-21 23:36:49
【问题描述】:

我有两个故事板,每个故事板都有自己的视图控制器,但我需要根据第一个视图控制器中按下的按钮更改第二个故事板的外观。

在我拥有的第一个视图控制器中:

// First view controller .h
#import <UIKit/UIKit.h>
#import "SecondViewController.h"

@interface FirstViewController : UIViewController
@property (strong, nonatomic) IBOutlet UIButton *LevelOneButton; // tag 0
@property (strong, nonatomic) IBOutlet UIButton *LevelTwoButton; // tag 1

-(IBAction)selectLevel:(UIButton *)sender; // both buttons connected to this method
@property (assign, nonatomic) int levelSelect;

@end

然后在第一个 .m 文件中:

//FirstViewController.m
-(IBAction)selectLevel:(UIButton *)sender {
    if (sender.tag == 0) {
        _levelSelect = 0;
    }
    if (sender.tag == 1) {
        _levelSelect = 1;
    }
}

此代码工作正常,但问题出现在我拥有的 secondViewController 中。当我尝试访问 SecondViewController 中的 levelSelect 属性时,我收到错误“在 'FirstViewController' 类型的对象上找不到属性 'levelSelect'”或“意外的标识符 levelSelect”或这些行中的某些内容。我已经尝试了我能想到的每一件事以及我在 StackOverflow 上发现的与此相关的每一个问题,但没有一个能够解决问题。有谁知道我做错了什么?

【问题讨论】:

    标签: ios storyboard


    【解决方案1】:

    您应该在推动或转接时在第二个视图控制器上设置属性。

    所以在你的第一个视图控制器中它应该看起来像这样:

    #import "ViewController.h"
    #import "SecondViewController.h"
    @interface ViewController ()
    @property (strong, nonatomic) IBOutlet UIButton *levelOne;
    @property (strong, nonatomic) IBOutlet UIButton *levelTwo;
    @property (assign, nonatomic) int selectedLevel;
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        self.levelOne.tag = 1;
        self.levelTwo.tag = 2;
    }
    
    - (IBAction)selectLevel:(UIButton *)sender
    {
        if (sender.tag == 1) {
            self.selectedLevel = 1;
        } else {
            self.selectedLevel = 2;
        }
    
        [self performSegueWithIdentifier:@"pushToSecond" sender:self];
    
    }
    
    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
    {
        SecondViewController *dest = segue.destinationViewController;
        dest.levelSelect = self.selectedLevel;
    }
    
    @end
    

    现在,当viewDidLoadSecondViewController 上被调用时,该属性将被设置并且您可以使用它。像这样:

    #import "SecondViewController.h"
    
    @interface SecondViewController ()
    @property (strong, nonatomic) IBOutlet UILabel *levelLabel;
    
    @end
    
    @implementation SecondViewController
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        self.levelLabel.text = [@(self.levelSelect) stringValue];
    
    }
    
    @end
    

    快速编辑,如果你不使用 segues,你可以通过手动推送来做同样的事情。看起来像:

    - (IBAction)selectLevel:(UIButton *)sender
    {
        if (sender.tag == 1) {
            self.selectedLevel = 1;
        } else {
            self.selectedLevel = 2;
        }
    
        SecondViewController *secondVC = [[UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]] instantiateViewControllerWithIdentifier:@"second"];
        secondVC.levelSelect = self.selectedLevel;
        [self.navigationController pushViewController:secondVC animated:YES];
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-10
      • 1970-01-01
      相关资源
      最近更新 更多