繁体   English   中英

在目标控制器中设置类的属性

[英]Set property of a class in a destination controller

我试图设置在目标序列中实例化的类的属性。

具体来说,我有一个带有按钮的根视图控制器。 通过故事板,按钮只是另一个视图控制器的一个按钮。 在prepareForSegue中,我实例化目标视图控制器,然后设置一个属性。

当属性是目标的简单对象(int,NSInt,NSString等)时,赋值起作用-即我可以在赋值之前和之后使用NSLog,并看到值从零变为我分配的数字。

但是,当该属性是我创建的简单类的实例时,没有编译或运行时错误,但该值保持为零。

我尝试过的事情:

我的理解是@synthesize是自动完成的,但是我还是尝试了。

我也尝试将属性放在类头接口中,但是我也不认为这是必需的。

我还使用下面的代码构建了一个新项目,以确保它不是一个奇怪的东西,因为它是更大的应用程序的一部分。 由于工作正常,我将代表排除在后退事务之外。

我发现了很多将数据转发的示例,但是找不到所需的类。

鉴于没有错误,这感觉像是范围或初始化问题,但是经过三天的摸索,我没有了主意。

// menuViewController.h

#import <UIKit/UIKit.h>
#import "Settings.h"
#import "setupViewController.h"

@interface menuViewController : UIViewController
@end

// menuViewController.m

#import "menuViewController.h"

@interface menuViewController ()
@property (weak, nonatomic) IBOutlet UIButton *myButton;

@end

@implementation menuViewController {
Settings *menuSettings;
}

- (void)viewDidLoad {
    [super viewDidLoad];
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"toSecond"]) {
        setupViewController *instanceOfSetupViewController = segue.destinationViewController;

        // This assign doesn't change the property in the destination
        instanceOfSetupViewController.myLocalSettings.bpm = 67;

        // This local assign works
        menuSettings.bpm = 77;
        // But this assign doesn't change the property in the destination
        instanceOfSetupViewController.myLocalSettings = menuSettings;
    }
}

- (IBAction)prepareForUnwind:(UIStoryboardSegue *)segue {}

// setupViewController.h

#import <UIKit/UIKit.h>
#import "Settings.h"

@interface setupViewController : UIViewController

@property () Settings* myLocalSettings;
@end

// setupViewController.m

#import "setupViewController.h"

@interface setupViewController ()
@property (weak, nonatomic) IBOutlet UIButton *myButton;

@end

@implementation setupViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    Settings *myLocalSettings = [[Settings alloc] init];
    myLocalSettings.bpm = 13;
}

- (IBAction)myButtonClicked:(id)sender {
    [self performSegueWithIdentifier:@"fromSecond" sender:self];
}

// Settings.h

#import <Foundation/Foundation.h>

@interface Settings : NSObject

@property () NSInteger bpm;
@end

// Settings.m

#import "Settings.h"
@implementation Settings
@end

谢谢!

这是行不通的,因为尚未创建Settings对象,因此myLocalSettings为nil。 在调用prepareForSegue时,尚未加载目标视图控制器的视图,因此尚未创建您在viewDidLoad中实例化的Settings对象(您应该删除该对象,否则它将覆盖您在此处创建的对象)。 您应该首先在prepareForSegue中创建该实例,

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"toSecond"]) {
        setupViewController *instanceOfSetupViewController = segue.destinationViewController;
        instanceOfSetupViewController.myLocalSettings = [Settings new];
        instanceOfSetupViewController.myLocalSettings.bpm = 67;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM