如何访问不同视图控制器中的属性?

Posted

技术标签:

【中文标题】如何访问不同视图控制器中的属性?【英文标题】: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”或这些行中的某些内容。我已经尝试了我能想到的每一件事以及我在 *** 上发现的与此相关的每一个问题,但没有一个能够解决问题。有谁知道我做错了什么?

【问题讨论】:

【参考方案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];

【讨论】:

以上是关于如何访问不同视图控制器中的属性?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用核心数据访问保存在不同视图控制器中的阵列?

(Rails)从不同视图中的控制器访问方法

如何在 Swift 的不同视图控制器中更新同一实体的属性?

如何访问标签栏控制器中的标签栏?

访问 UIViewController 中的自定义 UINavigationController 属性和方法

从子视图访问属性到 ViewController Swift