gpt4 book ai didi

objective-c - 实例变量在 initWithNib 之后和 NSViewController 中的 IBAction 之前丢失值

转载 作者:搜寻专家 更新时间:2023-10-30 20:26:25 26 4
gpt4 key购买 nike

我正在编写的 OS X 应用程序有一个非常基本的初始化问题。我正在我的 NSViewController 中的 initWithNibName 中初始化实例变量。但是,当我在我的 IBAction 方法中访问它们时,这些变量失去了它们的值并最终等于 nil。

这是我的代码。我有一个有 1 个主窗口和 1 个 NSViewController 的应用程序。应用程序委托(delegate)在 applicationDidFinishLoading 中以编程方式调用 initWithNibName。 View 出现, View 中的按钮成功调用onButtonClick。但是,在该方法中,myString 的值为空。日志清楚地显示它在 initWithNibName 方法期间已成功初始化。所以它在 initWithNibName 和按钮点击之间失去了它的值(value)。

//MyAppDelegate.m
@implementation MyAppDelegate

@synthesize window;

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
MainView* mainViewController = [[MainView alloc] initWithNibName:@"MainView" bundle:[NSBundle mainBundle]];
[mainViewController loadView];
NSView *controllerView = [mainViewController view];
[window setContentView:controllerView];
}

@end

//MainView.h
@interface MainView : NSViewController {
NSButton *myButton;
NSString* myString;
}

@property (assign) IBOutlet NSButton *myButton;
@property (assign) NSString* myString;

- (IBAction)onMyButtonClick:(id)sender;

@end

//MainView.m
@implementation MainView

@synthesize myButton;
@synthesize myString;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
NSLog(@"initWithNibName");
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Initialization code here.
NSLog(@"Initializing...");
[self setMyString:@"try to set the variable"];
NSLog(@"String is %@", myString);
}

return self;
}

- (void)awakeFromNib {
NSLog(@"awakeFromNib");
//[self setMyString:@"init in here works, but is called too many times"];
}

- (IBAction)onMyButtonClick:(id)sender{
NSLog(@"Button clicked");
NSLog(@"%@", myString); //Always nil when initialized in initWithNibName()!!
}

@end


//Logs

initWithNibName
Initializing...
String is try to set the variable
awakeFromNib
awakeFromNib
Button clicked
(null)

如何让 myString 保留其值?

我已经尝试了我能想到的所有类型的属性声明。我还尝试了各种赋值方法([self setMyString]、self.myString = @"blah"、myString = [NSString stringWithFormat:@"blah"] 等)。

我读到我应该在 awakeFromNib() 中进行初始化。这确实有效。但是,我最终的初始化代码将包括一系列 [[MyObj alloc] init] 调用,当它们被多次调用时,会产生多个指针,这很疯狂。我的最终目标是拥有一个指向对象的指针, Controller 可以始终引用该对象并始终获取相同的数据。该对象由 Controller 初始化, Controller 保存引用并在用户与 Controller 交互时根据需要更新它。

那么有什么方法可以在 NSViewControllers 中初始化实例变量,只初始化一次,并让它们在 Controller 的生命周期内保留它们的值?

谢谢

KV

最佳答案

您应该将属性声明为(复制)而不是(分配)

关于objective-c - 实例变量在 initWithNib 之后和 NSViewController 中的 IBAction 之前丢失值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8590853/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com