【问题标题】:InitWithName Execution Before ViewDidLoad Possible?在 ViewDidLoad 之前执行 InitWithName 可能吗?
【发布时间】:2013-03-25 16:31:12
【问题描述】:

我试图在两个视图控制器之间移动一个 NSString,在搜索了所有复杂的方法之后,我想习惯的最简单和最直接的方法是在接收 VC 中编写一个 initWithName 函数并调用它在发送 VC 中。它确实成功地移动了它,但我希望它在 ViewDidLoad 加载 textViewer 之前执行,以便在按下选项卡按钮后立即显示。这是来自发送 VC 的代码:

- (void)textViewDidEndEditing:(UITextView *)textView
{   
    if ([textView.text isEqualToString: @""]) {
        textView.text = @"*Paste the machine code in question here*";
    }
    SecondViewController *theVCMover = [[SecondViewController alloc] initWithName: textView.text];
    [self.navigationController pushViewController:theVCMover animated:YES]; //Is this really necessary if I'm not going to segue it directly, I'm just waiting for the user to press the next tab
    gotItLabel.text = @"Got it! Ready for action...";
}

这是接收 VC 上的代码:

 - (id)initWithName:(NSString *)theVCMovee {
    self = [super initWithNibName:@"SecondViewController" bundle:nil];
    if (self) {
        rawUserInput = theVCMovee;
        CleanerText.text = rawUserInput;
    }
    return self;
} 
- (void)viewDidLoad {
        [super viewDidLoad];
    CleanerText.text = rawUserInput;
        NSLog(@"Got the other tab's text and it's %@ ", rawUserInput);

}

【问题讨论】:

  • viewDidLoad 在视图加载后被调用,并且视图在第一次尝试访问它时被加载,例如调用viewController.view,或者让父视图控制器布置其子视图(或显示其根视图控制器视图的窗口)。因此,只要您不尝试自己访问 view 属性,并且屏幕上还没有发生布局,您应该可以安全地在调用 viewDidLoad 之前设置您想要的所有参数(即在 @987654327 之间@ 和代码中的 push…
  • 您是否使用自动引用计数 (ARC),rawUserInput 是如何定义的? (我们能看到 .h 吗?)
  • 是的,使用 ARC,你去:“@property (strong, nonatomic) NSString *rawUserInput;”
  • 我还尝试使用“theVCMover.CleanerText.text = textView.text;”直接移动字符串但同样,什么都没有。这看起来很正常还是我的代码有问题?

标签: iphone objective-c viewcontroller viewdidload


【解决方案1】:

您的代码大部分都很好,但是您会发现,由于您拥有更复杂的视图控制器,因此您不一定要编写自定义初始化程序来完成所有属性设置。请注意,如果 CleanerText 是您从 nib 加载的 UI 元素,则在您的 init 方法中设置 CleanerText.text 无济于事 - 在调用 -viewDidLoad 之前它不会加载。

但是,如果您声明 rawUserInput 的属性或您想要设置的其他变量,您不必在 init 中执行所有操作。然后你就可以走了:

SecondViewController *theVCMover = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];
theVCMover.rawUserInput = textView.text;
theVCMover.otherProperty = otherValue;
....

您的其余代码的工作方式相同。

【讨论】:

  • 好的,感谢关于多移动器位的提示,但话又说回来,如何在用户加载选项卡后立即将移动的字符串加载到 textViewer 中。我可以只做一个“加载”按钮,但我想学习,因为这对我来说似乎很重要。
  • 我还尝试使用“theVCMover.CleanerText.text = textView.text;”直接移动字符串但同样,什么都没有。这看起来很正常还是我的代码有问题?
  • 这段代码没问题。如果您没有看到您期望的文本,那么问题就出在了其他地方。 CleanerText 是一个在SecondViewController.xib 中连接的IBOutlet
  • 是的,我也这样做了...这是我的项目文件的图片:cl.ly/2o0V2Z2L3P16
【解决方案2】:

init 完成执行之前,您不能(可靠地)调用实例上的方法,因此这种模式是“安全的”并且它应该是这样工作的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 2014-07-16
    相关资源
    最近更新 更多