更改插座对象属性

时间:2012-11-05 23:41:42

标签: ios uiviewcontroller iboutlet

我有一个视图控制器 alertForNeedsClassification 作为另一个类中的属性,如下所示:

@interface SCAAppDelegate()
{
    HomeScreenViewController * _homeScreenViewController;
    NSInteger SCAStatus;
}
@property (strong, nonatomic) PromptClassifyViewController * alertForNeedsClassification;
@end

@implementation SCAAppDelegate

@synthesize alertForNeedsClassification;
@synthesize window = _window;

PromptClassifyViewController的界面如下所示:

@interface PromptClassifyViewController : UIViewController

@property (weak, nonatomic) IBOutlet UILabel *headerTitle;
@property (weak, nonatomic) IBOutlet UITextView *message;
@property (weak, nonatomic) IBOutlet UIButton *notNowButton;
@property (weak, nonatomic) IBOutlet UIButton *classifyButton;
@property (weak, nonatomic) IBOutlet UIImageView *backgroundImageView;
@property (weak, nonatomic) IBOutlet UIView *alertView;
@property NSUInteger tag;

@property (weak, nonatomic) IBOutlet id<PromptClassifyViewControllerDelegate> delegate;

- (void)show;
- (void)showFromView:(UIView *)view;
- (IBAction)show:(id)sender;
- (IBAction)dismiss:(id)sender;
- (IBAction)buttonWasPressed:(id)sender;
- (void)setHeaderTitleWithText:(NSString *)text;

@end

我正在尝试更改IBOutlets 消息 headerTitle 文本的值,如下所示:

alertForNeedsClassification = [[PromptClassifyViewController alloc] initWithNibName:@"PromptClassifyViewController" bundle:nil];
            //[alertForNeedsClassification setDelegate:self];
            self.alertForNeedsClassification.headerTitle.text =  @"A title";


            alertForNeedsClassification.message.text = @"A message";

然后我显示 alertForNeedsClassification 调用 show 方法(它类似于自定义uialertview,但它不是uialertview的子类)。

事情是,无论我如何改变它,alertForNeedsClassification.view上的文本总是在nib中定义的文本,即。我不能以编程方式更改它。

我的自定义提醒视图基于Jeff LaMarche的设计:http://iphonedevelopment.blogspot.com/2010/05/custom-alert-views.html

有什么想法可能会发生什么?

2 个答案:

答案 0 :(得分:0)

分配和初始化UIView对象时请小心,特别是如果您尝试使用Nib混合并动态生成对象。最佳位置在-(void)awakeFromNib-(void)viewDidLoad

之内

另外,请确保调用这些方法。使用-(id)initWithNibName:bundle:只能确保您的视图无法加载。在parentViewController的视图上尝试-(void)addChildViewController-(void)addSubview:,以确保在初始化后加载视图。

如果必须在加载前准备文本,请将其分配到NSString类中的单独PromptClassifyViewController属性。由于此属性独立于正在加载的视图,因此可以在出现视图之前更改其值。确保使用此文本并将其应用于headerTitle方法中的-(void)show

由于您从PromptClassifyViewController分配weak并访问headerTitle self. alertForNeedsClassification,因此请确保此后不会取消分配。

通常,weak选项不用于IBOutlet属性。虽然通过从Interface Builder拖动对象来生成插座连接代码时使用它。尝试使用strong测试您的代码。

答案 1 :(得分:0)

在分配/初始化之前,我正在为IBOutlets分配值。我实现的解决方案是设置非IBOutlet属性所需的值(在本例中为NSStrings)并在需要时分配那些,在Prompt ... Controller的viewDidLoad;