【问题标题】:Changing outlet object properties更改出口对象属性
【发布时间】:2012-11-05 23:41:41
【问题描述】:

我有一个视图控制器 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 messageheaderTitle 文本的值,如下所示:

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 上的文本始终是笔尖中定义的文本,即。我无法以编程方式更改它。

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

有什么想法吗?

【问题讨论】:

  • 记录 headerTitle 的值以查看它是否为空。如果不是,您可能需要调用 setNeedsDisplay 来更新视图。
  • 它实际上是空的。 (已编辑)
  • 在我设置后立即记录它会返回 null。它甚至不返回从笔尖获取的值。
  • @property 前面的小圆圈是实心的还是空心的?
  • 它很稳固。为了确定,我断开并重新连接了插座。

标签: ios uiviewcontroller iboutlet


【解决方案1】:

在分配和初始化UIView 对象时请小心,尤其是当您尝试使用 Nib 混合并动态生成对象时。最好的地方在-(void)awakeFromNib-(void)viewDidLoad之内

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

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

由于您分配了 PromptClassifyViewController 并访问了从 self. alertForNeedsClassification 引用的 headerTitleweak,因此请确保之后不会立即释放它。

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

【讨论】:

  • 当您从 xib 拖动到界面时,Xcode 会自行将 IBOutlets 设置为弱。 (编辑 - 无论如何都要尝试将其设置为强以查看结果是否不同)
  • 以前是strong 仔细看了你的问题后我修改了答案
  • 此时,我非常确信我试图在分配和初始化 headerTitle 和 message 之前对其进行定义。 PromptClassifyViewController 的 viewDidLoad 在我完成分配后运行,而 awakeFromNib 似乎根本没有运行。我认为解决方案是设置一些 NSString 属性,然后将它们分配给 viewDidLoad 中的 message.text 和 headerTitle.text。
  • 它可以按您的意愿工作,如果您可以在加载后更改 headerTitle 并添加到超级视图之前
  • 嗯我不知道在这种情况下是否可能。我在尝试修改其出口后立即添加视图。中间没有步骤(从超级视图的角度来看)。
【解决方案2】:

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

【讨论】:

  • 感谢大家的帮助。
猜你喜欢
  • 2018-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多