【问题标题】:can't change NSTextField text无法更改 NSTextField 文本
【发布时间】:2011-06-16 14:01:35
【问题描述】:

我遇到了 NSTextField 的问题 - 我无法更改其中的文本(可以在 (void)awakeFromNib 中更改一次,但之后就不行了)。

我会在这里给你我的标题和实现:

#import <Cocoa/Cocoa.h>
#import "Employee.h"


@interface EmployeeView : NSViewController {  
    NSTextField *mikk;  
    Employee *employee;  
}

@property (retain) IBOutlet NSTextField *mikk;  
@property (retain) Employee *employee;

- (void)setSelectedEmployee:(Employee*)employeeIn;

@end


#import "EmployeeView.h"


@implementation EmployeeView

@synthesize mikk, employee;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil  
{  
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];  
    if (self) {  
        // Initialization code here.  
    }  

return self;  
}  

- (void)setSelectedEmployee:(Employee*)employeeIn  
{  
    employee = employeeIn;  
    NSLog(@"given employee = %@", employee.fullName);
    [mikk setStringValue: @"hi"];  
}  

-(void)awakeFromNib  
{  
    NSLog(@"i awoke");  
    [mikk setStringValue:@"hello"];
}  

- (void)dealloc  
{  
    [employee release];  
    [mikk release];  
    [super dealloc];  
}  

@end  

可能看起来很f-d,但重点是我调用了方法

- (void)setSelectedEmployee:(Employee*)employeeIn

在我的 appDelegate 中并给它选择的“员工”,因此该实例有一个员工可以使用。我确定它会获取给定的员工,因为 NSLog 总是能正确打印出来。
名为“mikk”的 NSTextField 在 IB 中正确链接,因为它在 awakeFromNib 方法中将标签文本设置为“hello”。所以主要问题是:为什么我不能在别处设置标签文本?

我知道这看起来很奇怪/愚蠢,但如果您想了解更多信息(还有什么,如果您可以更具体的话)和建议以使该文本更具可读性,请告诉我。

编辑:查看代码,只留下“i-think-important-bits”。还保留了 IBOutlet,对目标没有任何影响。

【问题讨论】:

  • 你也设置了view 插座吗?
  • @Caleb,很抱歉把不必要的东西放在那里,我昨天太累了。 @Bavarious,我已经将 IB 中的视图与 NSViewController 连接起来(这是使用 EmployeeView 的自定义类)。我也应该在代码中为它创建一个Outlet 吗?
  • NSViewController 已经声明了一个 view 出口,你说你已经连接了。 (作为记录,cmets 中的@ 仅通知第一个用户;在您的评论中,它通知了 Caleb 但没有通知我。)

标签: objective-c cocoa nstextfield


【解决方案1】:

尝试改变

@property (assign) IBOutlet NSTextField *mikk; 

@property (retain) IBOutlet NSTextField *mikk; 

【讨论】:

  • 这是正确的答案。您正在为您的插座使用分配属性,因此文本字段在加载后被释放。
  • @Caleb 为什么会发布?
  • @Bavarious,请参阅下面的答案。 “收集”可能比“发布”更好,但我通常处于 iOS 心态,所以我默认考虑保留/释放。
【解决方案2】:

你在使用垃圾收集吗?以下是docs on nib loading 对垃圾回收下的对象保留的看法:

图表中的大多数对象都保存在 通过强引用记忆 物体之间。只有 nib 文件中的顶级对象 最初没有强引用。 因此,您的代码必须创建强大的 引用这些对象以防止 对象图被释放。

因此,如果您没有对包含文本视图的顶级对象(可能是视图或窗口)的强引用,则可能正在收集整个对象图。

【讨论】:

  • 我正在使用垃圾收集。如果它改变了任何东西,我在EmployeeViewappDelegate 中创建了一个实例,并在需要时使用它来调用它。
  • 大概EmployeeView 是包含相关标签的视图?您是通过从笔尖加载它来创建它吗?不管细节如何,如果您调用-setSelectedEmployee: 并且mikk 指向的标签没有改变,那么mikk 似乎指向了错误的东西,或者根本没有指向任何东西。尝试查看-awakeFromNib 中的指针值,然后再次查看-setSelectedEmployee:。如果它发生变化,那么 mikk 就会以某种方式被修改。如果没有,那么它指向的内存可能正在更改、取消分配等。
  • @Caleb,是的,是的,我在这些方法中添加了断点,并看到它第二次调用-awakeFromNib(程序调用它两次,可以吗?)mikk 是指向0x0(在第一次调用时它有一个有效的内存地址)并且它在程序中保持0x0
  • @Mikk,如果 mikk 是 0x0(即 nil),那么您可能忘记将其连接到您笔尖中的文本字段。我知道你说它的值设置为“你好”,但想知道你是否也没有在笔尖中设置它?此外,如果 -awakeFromNib 在同一个类上被调用两次,这可能意味着您要实例化该类两次,在这种情况下这可能不是您想要的。
  • @Caleb,它在笔尖中正确连接,并在运行时更改它(在笔尖中,它的标题是“标签”),但我想我在这里遇到的根本问题是我做了另一个类的实例。感谢您帮助我走上正确的道路。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-20
  • 1970-01-01
  • 2016-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多